This is hopefully the results section for the Study 2 NSE & SE babies watching ASL Stories. We have two main factors:

  1. Language (Sign v. English)
  2. Direction (Forward v. Reversed)

Ages of babies are from 5 to 14.99 months. That means we lose two “old” CODA babies - Janine (16 mo) and za02 (23 mo). The dataset also contains factors for younger v. older babies IF we want to do age group splits. I do not recommend it because we lose all significance that way and we have more precise age information, better than brute groups. IF we do use it, the baby age groups are such:

  • Younger babies = 5 to 8.99 months
  • Older babies = 9.0 to 14.99 months

Demographics

library(tidyverse)
library(janitor)
library(lme4)
library(lmerTest)
library(scales)
library(feather)
library(GGally)

# Grab data that was produced in 03importcleanbabies.Rmd
babies <- read_feather("cleanedbabyeyedata.feather") %>%
  mutate(age = age*12) %>%
  select(participant, language, age, gender, story, direction, mark, trial, repetition, aoi, secs, percent) %>%
  rename(name = participant) %>%
  mutate(agegroup = case_when(
    age <= 8.99 ~ "younger",
    age >= 9.0 & age < 15 ~ "older"
  )) %>%
  filter(!is.na(agegroup)) %>%
  mutate(language = case_when(
    language == "english" ~ "NSE",
    language =="sign" ~ "SE"
  )) %>%
  rename(lang = language) %>%
  mutate(lang2 = case_when(
    name == "aubrey CODA 11m" ~ "HSE",
    name == "GemmaF_11_4_13_CODA" ~ "HSE",
    name == "Hannah_CODA_7m" ~ "HSE",
    name == "ke11es12_7m_MomTerp" ~ "LSE",
    name == "Miles_14m_SE" ~ "HSE",
    name == "Parker 6 m SIGNING" ~ "HSE",
    name == "Penn 6 months SIGN EXPOSED" ~ "HSE",
    name == "Trinity 8m" ~ "LSE",
    name == "Victoria07_18_17" ~ "LSE",
    name == "Wells_8mos" ~ "LSE",
    TRUE ~ lang
  ))
#  filter(name != "Victoria07_18_17")

babiesinfo <- babies %>%
  select(name, lang, age, gender) %>%
  distinct() %>%
  group_by(lang) %>%
  summarise(N = n(),
            age_mean = mean(age),
            sd = sd(age),
            min = min(age),
            max = max(age))

genders <- babies %>%
  select(name, lang, age, gender) %>%
  distinct() %>%
  group_by(lang, gender) %>%
  summarise(N = n()) %>%
  spread(gender, N)

babiesinfo <- left_join(babiesinfo, genders) %>%
  select(lang, N, Female, Male, age_mean, sd, min, max) %>%
  print()

Call:
lm(formula = age ~ lang, data = distinct(select(babies, age, 
    lang)))

Residuals:
   Min     1Q Median     3Q    Max 
-3.103 -2.206 -1.456  2.624  5.324 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   7.8764     0.8774   8.977 1.21e-07 ***
langSE        2.1865     1.4070   1.554     0.14    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.91 on 16 degrees of freedom
Multiple R-squared:  0.1311,    Adjusted R-squared:  0.07684 
F-statistic: 2.415 on 1 and 16 DF,  p-value: 0.1397

Global Looking

We calculated percentages based on overall clip length as the denominator. In this way, we can meaningfully contrast looking times at the videos (which are variable lengths) based on different factors. But when we go to AOI analysis we need to re-calculate the percentages so the denominator is based on total looking time, not overall clip length.

The chart below shows little differences based on factors Age, Language, or Direction. That’s good, means the videos were equally engaging for all babies, right?

A linear model shows there were no significant effects of any factors. We can conclude there was no effect on how much the babies looked at the stimuli.

Model failed to converge with max|grad| = 0.0100956 (tol = 0.002, component 1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: 
percent ~ age + lang * direction + (direction | name) + (direction |  
    story)
   Data: babies_overall_looking

REML criterion at convergence: -109.5

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.17413 -0.71098 -0.01308  0.70596  2.47194 

Random effects:
 Groups   Name              Variance  Std.Dev. Corr 
 name     (Intercept)       0.0103068 0.10152       
          directionreversed 0.0009225 0.03037  1.00 
 story    (Intercept)       0.0086390 0.09295       
          directionreversed 0.0039253 0.06265  -0.76
 Residual                   0.0330605 0.18183       
Number of obs: 349, groups:  name, 26; story, 8

Fixed effects:
                          Estimate Std. Error        df t value Pr(>|t|)
(Intercept)               0.678349   0.086566 28.389111   7.836 1.41e-08
age                       0.002112   0.008899 23.169957   0.237    0.814
langSE                   -0.049561   0.050340 23.826263  -0.985    0.335
directionreversed        -0.033420   0.034809 12.356798  -0.960    0.355
langSE:directionreversed  0.019252   0.041719 94.727001   0.461    0.646
                            
(Intercept)              ***
age                         
langSE                      
directionreversed           
langSE:directionreversed    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.853                     
langSE      -0.067 -0.181              
dirctnrvrsd -0.228  0.005  0.069       
lngSE:drctn  0.034  0.000 -0.127 -0.497
convergence code: 0
Model failed to converge with max|grad| = 0.0100956 (tol = 0.002, component 1)
Computing profile confidence intervals ...
non-monotonic profile for .sig02non-monotonic profile for .sig05bad spline fit for .sig02: falling back to linear interpolationbad spline fit for .sig05: falling back to linear interpolation
                                 2.5 %     97.5 %
.sig01                    0.0620478402 0.14127848
.sig02                   -1.0000000000 1.00000000
.sig03                    0.0000000000 0.07371618
.sig04                    0.0517443908 0.14795142
.sig05                   -1.0000000000 0.62776099
.sig06                    0.0001206534 0.11509190
.sigma                    0.1681790045 0.19678094
(Intercept)               0.5182792219 0.84146936
age                      -0.0146536022 0.01861433
langSE                   -0.1442384160 0.04487979
directionreversed        -0.0983969980 0.03156203
langSE:directionreversed -0.0624469660 0.10063677

AOI Looking

Now we’ll re-calculate the percentages so the denominator is based on total looking time. All AOIs should sum up to 100% for each trial and each baby. Next let’s make a boxplot of all AOIs.

It appears two important AOIs are MidChestTop and MidFaceBottom. Let’s look again only at midline AOIs:

I’m going to run linear models with only MidChestTop or MidFaceBottom, and see what happens. No age interactions.

MidChestTop:

  • Significant effect of age (p = 0.002) - older babies look at MidChestTop AOI more.
  • Significant effect of language (p = 0.010) - NSE babies look +13.6% more than SE babies.
  • Significant effect of direction (p = 0.046) - Babies look about 4.5% less for reversed
  • No language X direction interaction.

MidFaceBottom:

  • No effect of age
  • Significant effect of language (p = 0.005) - SE babies look +19% more than NSE babies.
  • Marginal effect of language (p = 0.104) - Babies look about 3% more for reversed.
  • No language X direction interaction.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: percent ~ age + lang * direction + (1 | name) + (1 | story)
   Data: filter(babies, aoi == "MidChestTop")

REML criterion at convergence: -215.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.0298 -0.7175 -0.1352  0.6298  2.6697 

Random effects:
 Groups   Name        Variance  Std.Dev.
 name     (Intercept) 0.0115078 0.1073  
 story    (Intercept) 0.0002281 0.0151  
 Residual             0.0253723 0.1593  
Number of obs: 349, groups:  name, 26; story, 8

Fixed effects:
                           Estimate Std. Error         df t value
(Intercept)                0.123866   0.076757  23.371972   1.614
age                        0.028038   0.008448  22.005650   3.319
langSE                    -0.132994   0.050397  27.850283  -2.639
directionreversed         -0.044820   0.022405 320.419630  -2.000
langSE:directionreversed   0.039943   0.034787 318.190116   1.148
                         Pr(>|t|)   
(Intercept)               0.12001   
age                       0.00312 **
langSE                    0.01346 * 
directionreversed         0.04629 * 
langSE:directionreversed  0.25175   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.912                     
langSE      -0.092 -0.172              
dirctnrvrsd -0.139 -0.001  0.213       
lngSE:drctn  0.085  0.006 -0.336 -0.644
Computing profile confidence intervals ...
                               2.5 %        97.5 %
.sig01                    0.07183592  0.1408795019
.sig02                    0.00000000  0.0455736684
.sigma                    0.14721089  0.1721220249
(Intercept)              -0.02299300  0.2706422164
age                       0.01187038  0.0442054478
langSE                   -0.22928875 -0.0366528701
directionreversed        -0.08864808 -0.0008204047
langSE:directionreversed -0.02820489  0.1081961718
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: percent ~ age + lang * direction + (1 | name) + (1 | story)
   Data: filter(babies, aoi == "MidFaceBottom")

REML criterion at convergence: -159.7

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.42568 -0.76861 -0.01802  0.69751  2.50871 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept) 0.019840 0.14085 
 story    (Intercept) 0.002588 0.05088 
 Residual             0.028320 0.16829 
Number of obs: 349, groups:  name, 26; story, 8

Fixed effects:
                           Estimate Std. Error         df t value
(Intercept)                0.327355   0.099254  25.201834   3.298
age                       -0.008293   0.010813  22.878745  -0.767
langSE                     0.193677   0.063358  26.931393   3.057
directionreversed          0.038757   0.023800 317.155595   1.628
langSE:directionreversed  -0.052648   0.036870 315.966430  -1.428
                         Pr(>|t|)   
(Intercept)                0.0029 **
age                        0.4510   
langSE                     0.0050 **
directionreversed          0.1044   
langSE:directionreversed   0.1543   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.902                     
langSE      -0.082 -0.176              
dirctnrvrsd -0.113 -0.001  0.179       
lngSE:drctn  0.069  0.005 -0.283 -0.647
Computing profile confidence intervals ...
                                2.5 %     97.5 %
.sig01                    0.098862423 0.18348410
.sig02                    0.024985536 0.09798262
.sigma                    0.155497012 0.18175853
(Intercept)               0.136571835 0.51798698
age                      -0.029093105 0.01252478
langSE                    0.071974034 0.31548548
directionreversed        -0.007931901 0.08534794
langSE:directionreversed -0.124894091 0.01963867

Face-Chest Ratio

Next, we’ll define a Face-Chest Ratio (FCR) such that:

  1. MidFaceCenter, MidFaceBottom = Face
  2. MidChestTop, MidChestCenter, MidChestBottom, BelowChest = Chest
  3. FCR = face - chest / face + chest

We did not include Belly or MidFaceTop because of very low looking rates according to the boxplots above.

What will a linear mixed model tell us? (with no age interactions)

  • No effect of age. Interesting. Maybe because we don’t have that many babies.
  • Strong effect of language: SE babies have overall +0.43 FCR than NSE babies (p = 0.01); in other words, they are more attracted to the face.
  • Effect of direction: Reversal increases FCR by +0.12 across all babies (p = 0.039). Interesting.
  • Weak language x direction interaction. It seems NSE babies have a bigger reversal effect than SE babies? Trying to judge from the heat maps. (p = 0.1049). But it’s so weak so possibly not worth mentioning.
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: fcr ~ age + lang * direction + (1 | name) + (1 | story)
   Data: babies_fcr

REML criterion at convergence: 435.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.2099 -0.7696  0.1072  0.6216  2.3529 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept) 0.14617  0.3823  
 story    (Intercept) 0.01376  0.1173  
 Residual             0.15701  0.3962  
Number of obs: 349, groups:  name, 26; story, 8

Fixed effects:
                          Estimate Std. Error        df t value Pr(>|t|)
(Intercept)                0.03078    0.26449  24.55226   0.116   0.9083
age                       -0.03995    0.02900  22.79897  -1.378   0.1817
langSE                     0.45277    0.16836  25.88319   2.689   0.0124
directionreversed          0.11633    0.05604 316.92752   2.076   0.0387
langSE:directionreversed  -0.14108    0.08682 315.76750  -1.625   0.1051
                          
(Intercept)               
age                       
langSE                   *
directionreversed        *
langSE:directionreversed  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.907                     
langSE      -0.077 -0.179              
dirctnrvrsd -0.100 -0.001  0.159       
lngSE:drctn  0.061  0.004 -0.250 -0.647
Computing profile confidence intervals ...
                                2.5 %     97.5 %
.sig01                    0.271054322 0.49505092
.sig02                    0.057128269 0.22865024
.sigma                    0.366118773 0.42796786
(Intercept)              -0.477091044 0.53858818
age                      -0.095676033 0.01579032
langSE                    0.129600591 0.77612687
directionreversed         0.006295529 0.22595187
langSE:directionreversed -0.311081807 0.02922941

Heat Maps

And now heat maps!

Different Ways to Visualize Reversal

I want to try to visualize reversal effects a different way. Maybe this.

Or a reversal effect chart? Okay, so this chart tells us overall there really wasn’t much of a reversal effect for SE babies, they’re all hovering around 0. Interesting. While there seems to be a reversal effect for NSE babies where they look at the face more during reversed stories!

This analysis of within-subject variation here:

And a classic box/error plot with age collapsed.

Registering fonts with R
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Discussion re AOI/anatomical data

The biggest change is we lost the interaction between language and direction. For the ICSLA abstract we reported a strong interaction (p = 0.01), but now it’s p = 0.10. Shoot.

The interpretation here is that:

  • All babies looked equally at all videos regardless of language or direction. Good!
  • SE babies are stronger face-lookers than NSE babies. (Same as ICSLA)
  • Reversal appears to affect NSE babies more than SE babies? (Marginal). This is unlike ICSLA.

XY Space Data

We’ll load the data from the childxydata.feather file made in 06rawxydata.Rmd. So any new babies, please run the first code block in 06 to include it. Then we’ll keep all the babies we also have in the AOI data group.

Overall Looking

Let’s check that we have no significant group or condition differences in terms of valid (not empty) data points collected. This is same as “Global Looking” we have above, really, but w raw xy data.

A linear model shows there were no significant effects of any factors. We can conclude there was no effect on how much data was collected from the babies.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: 
data_points ~ age + lang * direction + (direction | name) + (direction |  
    story)
   Data: xy_overall

REML criterion at convergence: 5528.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.7591 -0.6647 -0.0082  0.6288  2.5534 

Random effects:
 Groups   Name              Variance Std.Dev. Corr 
 name     (Intercept)       20854.2  144.41        
          directionreversed   800.9   28.30   1.00 
 story    (Intercept)       22484.8  149.95        
          directionreversed  4209.1   64.88   -0.04
 Residual                   52394.3  228.90        
Number of obs: 401, groups:  name, 26; story, 8

Fixed effects:
                         Estimate Std. Error      df t value Pr(>|t|)
(Intercept)               530.672    119.943  29.510   4.424 0.000121
age                         7.772     12.021  23.311   0.646 0.524272
langSE                      9.965     68.206  23.876   0.146 0.885062
directionreversed         -20.420     38.038  11.694  -0.537 0.601450
langSE:directionreversed  -16.655     48.551 134.420  -0.343 0.732113
                            
(Intercept)              ***
age                         
langSE                      
directionreversed           
langSE:directionreversed    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.828                     
langSE      -0.057 -0.186              
dirctnrvrsd -0.045 -0.003  0.065       
lngSE:drctn  0.027  0.002 -0.133 -0.499
Computing profile confidence intervals ...
non-monotonic profile for .sig02non-monotonic profile for .sig05bad spline fit for .sig02: falling back to linear interpolationbad spline fit for .sig05: falling back to linear interpolation
                              2.5 %    97.5 %
.sig01                     94.37381 198.05145
.sig02                     -1.00000   1.00000
.sig03                      0.00000  79.33475
.sig04                     83.06418 264.23195
.sig05                     -1.00000   1.00000
.sig06                      0.00000 141.67953
.sigma                    212.91391 246.24259
(Intercept)               296.10665 769.95935
age                       -16.80438  31.72486
langSE                   -122.37062 144.10701
directionreversed         -96.43798  55.97517
langSE:directionreversed -112.38520  78.76240

XY Data LMMs

Now we’re going to run LMMs on babies’ raw:

  • horizontal spread (middle 50% of x data; xIQR)
  • vertical spread (middle 50% of y data; yIQR)
  • viewing area (A = middle-x * middle-y; area)

But to do this we first trim each baby’s data, getting rid of the first 60 samples (0.5 secs) of each trial.

Middle X

Results tell us that there is a significant effect of age where horizontal spread grew narrower with older babies (p = 0.024; slope = -2.2 px/month). There was a marginal effect of language where SE babies have slightly narrower horizontal spread (11 px; p = 0.088). No effects of reversal or interactions.

Model failed to converge with max|grad| = 0.00320909 (tol = 0.002, component 1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: xIQR ~ age + lang * direction + (1 | name) + (1 | story)
   Data: iqr

REML criterion at convergence: 3839.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.1303 -0.4823 -0.1684  0.2619  9.8734 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept) 105.6711 10.2796 
 story    (Intercept)   0.4599  0.6781 
 Residual             901.8340 30.0306 
Number of obs: 398, groups:  name, 26; story, 8

Fixed effects:
                         Estimate Std. Error       df t value Pr(>|t|)
(Intercept)               63.1895     8.5763  25.5875   7.368 8.82e-08
age                       -2.1897     0.9339  23.1557  -2.345   0.0280
langSE                   -12.3760     6.0882  41.4445  -2.033   0.0485
directionreversed          1.8858     3.8626 372.0751   0.488   0.6257
langSE:directionreversed   0.1957     6.1817 369.3450   0.032   0.9748
                            
(Intercept)              ***
age                      *  
langSE                   *  
directionreversed           
langSE:directionreversed    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.901                     
langSE      -0.121 -0.160              
dirctnrvrsd -0.214 -0.005  0.308       
lngSE:drctn  0.136  0.000 -0.503 -0.625
convergence code: 0
Model failed to converge with max|grad| = 0.00320909 (tol = 0.002, component 1)
Computing profile confidence intervals ...
Last two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepLast two rows have identical or NA .zeta values: using minstepslightly lower deviances (diff=-4.54747e-13) detectedLast two rows have identical or NA .zeta values: using minstepslightly lower deviances (diff=-4.54747e-13) detectedLast two rows have identical or NA .zeta values: using minstepslightly lower deviances (diff=-4.54747e-13) detectednon-monotonic profile for .sig02bad spline fit for .sig02: falling back to linear interpolationcollapsing to unique 'x' values
                              2.5 %     97.5 %
.sig01                     5.517731 14.3257965
.sig02                     0.000000  6.2873171
.sigma                    27.926919 32.2281330
(Intercept)               47.094920 79.2757838
age                       -3.940171 -0.4378617
langSE                   -23.852346 -0.8993574
directionreversed         -5.692211  9.4417865
langSE:directionreversed -11.912654 12.3126452

Middle Y

We had a significant effect of age where vertical spread got narrower with older babies (p = 0.019, slope = -5.5 px/month). There were no effect of language, direction, or interactions.

Model failed to converge with max|grad| = 0.00609049 (tol = 0.002, component 1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: yIQR ~ age + lang * direction + (1 | name) + (1 | story)
   Data: iqr

REML criterion at convergence: 4251

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.7596 -0.5266 -0.2214  0.3696  5.9050 

Random effects:
 Groups   Name        Variance  Std.Dev.
 name     (Intercept) 6.792e+02 26.06181
 story    (Intercept) 2.499e-04  0.01581
 Residual             2.479e+03 49.79276
Number of obs: 398, groups:  name, 26; story, 8

Fixed effects:
                         Estimate Std. Error      df t value Pr(>|t|)
(Intercept)               120.510     19.174  24.279   6.285 1.61e-06
age                        -5.600      2.113  22.966  -2.650   0.0143
langSE                    -17.254     12.936  32.133  -1.334   0.1917
directionreversed           8.759      6.406 371.126   1.367   0.1724
langSE:directionreversed   -5.694     10.251 370.658  -0.555   0.5789
                            
(Intercept)              ***
age                      *  
langSE                      
directionreversed           
langSE:directionreversed    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.911                     
langSE      -0.096 -0.171              
dirctnrvrsd -0.158 -0.004  0.240       
lngSE:drctn  0.101  0.000 -0.393 -0.625
convergence code: 0
Model failed to converge with max|grad| = 0.00609049 (tol = 0.002, component 1)
Computing profile confidence intervals ...
Last two rows have identical or NA .zeta values: using minstepnon-monotonic profile for .sig02bad spline fit for .sig02: falling back to linear interpolationcollapsing to unique 'x' values
                              2.5 %     97.5 %
.sig01                    17.067513  34.481568
.sig02                     0.000000  10.380480
.sigma                    46.299351  53.445276
(Intercept)               85.144804 155.891991
age                       -9.491015  -1.709599
langSE                   -41.342020   6.860432
directionreversed         -3.780771  21.323088
langSE:directionreversed -25.806149  14.366311

Viewing Area

Again, age is significant (p = 0.01) such that area gets smaller with age (about 500 sq. px. per month). No effect of language or direction or interactions.

boundary (singular) fit: see ?isSingular
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: area ~ age + lang * direction + (1 | name) + (1 | story)
   Data: iqr

REML criterion at convergence: 8154.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6682 -0.2747 -0.1284  0.0305 13.4651 

Random effects:
 Groups   Name        Variance  Std.Dev. 
 name     (Intercept) 6.314e+06 2512.8269
 story    (Intercept) 1.156e-02    0.1075
 Residual             5.292e+07 7274.7944
Number of obs: 398, groups:  name, 26; story, 8

Fixed effects:
                         Estimate Std. Error       df t value Pr(>|t|)
(Intercept)               9286.13    2088.34    25.69   4.447 0.000148
age                       -577.66     227.57    23.22  -2.538 0.018291
langSE                   -2119.67    1481.26    41.31  -1.431 0.159954
directionreversed          708.63     935.48   372.11   0.757 0.449231
langSE:directionreversed  -299.21    1497.33   371.33  -0.200 0.841722
                            
(Intercept)              ***
age                      *  
langSE                      
directionreversed           
langSE:directionreversed    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) age    langSE drctnr
age         -0.901                     
langSE      -0.120 -0.160              
dirctnrvrsd -0.213 -0.005  0.306       
lngSE:drctn  0.135  0.000 -0.501 -0.625
convergence code: 0
boundary (singular) fit: see ?isSingular
Computing profile confidence intervals ...
                             2.5 %     97.5 %
.sig01                    1345.191  3499.1946
.sig02                       0.000  1266.8763
.sigma                    6763.421  7808.4617
(Intercept)               5290.599 13280.6501
age                      -1013.228  -141.9810
langSE                   -4950.962   711.7087
directionreversed        -1123.117  2542.6941
langSE:directionreversed -3236.019  2631.9398

Puppies

Get puppy data!

# puppies1 <- read_tsv("../Child Data/_puppies/all puppies group 1 sums.txt", na = "-") %>% 
#   clean_names() %>%
#   select(-c(age, analysis, check_if_want_scatterplot, gender, language)) %>%
#   rename(name = x1) %>%
#   mutate(mean = rowMeans(.[2:10], na.rm = T)) %>%
#   select(name, mean)
#   
# puppies2 <- read_tsv("../Child Data/_puppies/all puppies group 2 sums.txt", na = "-") %>% 
#   clean_names() %>%
#   select(-c(age, analysis, check_if_want_scatterplot, gender, language)) %>%
#   rename(name = x1) %>%
#   mutate(mean = rowMeans(.[2:17], na.rm = T)) %>%
#   select(name, mean)
# 
# puppies <- rbind(puppies1, puppies2)
# 
# participants <- xydata %>% 
#   select(name, group, gender, lang) %>% 
#   distinct()
# 
# puppies <- left_join(participants, puppies, by = "name")
# 
# summary(lm(data = puppies, mean ~ lang))
# 
# puppies_se <- filter(puppies, lang == "NSE")
# puppies_nse <- filter(puppies, lang == "SE")
# 
# t.test(puppies_se$mean, puppies_nse$mean)

# Let's do this again but preserve puppy-level data
puppies1 <- read_tsv("../Child Data/_puppies/all puppies group 1 sums.txt", na = "-") %>% 
  clean_names() %>%
  select(-c(age, analysis, check_if_want_scatterplot, gender, language)) %>%
  rename(name = x1) %>%
  gather(key = puppy, value = sec, -name) %>%
  mutate(pups = case_when(
    str_detect(puppy, "huskies") ~ "huskies",
    str_detect(puppy, "golden") ~ "golden",
    str_detect(puppy, "wawa") ~ "wawa",
    str_detect(puppy, "frisby") ~ "frisby",
    str_detect(puppy, "bulldog") ~ "bulldog",
    str_detect(puppy, "puppy_jpg") ~ "puppy",
    TRUE ~ puppy
  ))

puppies2 <- read_tsv("../Child Data/_puppies/all puppies group 2 sums.txt", na = "-") %>% 
  clean_names() %>%
  select(-c(age, analysis, check_if_want_scatterplot, gender, language)) %>%
  rename(name = x1) %>%
  gather(key = puppy, value = sec, -name) %>%
  mutate(pups = case_when(
    str_detect(puppy, "huskies") ~ "huskies",
    str_detect(puppy, "golden") ~ "golden",
    str_detect(puppy, "wawa") ~ "wawa",
    str_detect(puppy, "frisby") ~ "frisby",
    str_detect(puppy, "bulldog") ~ "bulldog",
    str_detect(puppy, "puppies") ~ "puppies",
    TRUE ~ puppy
  ))

puppies <- rbind(puppies1,puppies2)

participants <- xydata %>%
  select(name, group, gender, lang) %>%
  distinct()

puppies <- left_join(participants, puppies, by = "name")

summary(lmer(data = puppies, sec ~ lang + (1|name) + (1|pups)))
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: sec ~ lang + (1 | name) + (1 | pups)
   Data: puppies

REML criterion at convergence: 15818.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.9738 -0.5348 -0.0747  0.3391  8.2862 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept) 0.8589   0.9268  
 pups     (Intercept) 0.1115   0.3339  
 Residual             1.8390   1.3561  
Number of obs: 4550, groups:  name, 26; pups, 7

Fixed effects:
            Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)   2.1716     0.2656 29.2675   8.178 4.78e-09 ***
langSE       -0.5248     0.3760 23.9275  -1.396    0.176    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
       (Intr)
langSE -0.545
                 2.5 %    97.5 %
.sig01       0.6940036 1.2121151
.sig02       0.1984206 0.6315016
.sigma       1.3285985 1.3845355
(Intercept)  1.6522810 2.6917220
langSE      -1.2644534 0.2148537

XY Space Data - Multiple Plots

First let’s prep the data.

funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once per session.
LS0tCnRpdGxlOiAiQmFiaWVzIC0gU3R1ZHkgMiAtIFJlc3VsdHMiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdGhlbWU6IHNwYWNlbGFiCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICB0b2NfZmxvYXQ6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKVGhpcyBpcyBob3BlZnVsbHkgdGhlIHJlc3VsdHMgc2VjdGlvbiBmb3IgdGhlIFN0dWR5IDIgTlNFICYgU0UgYmFiaWVzIHdhdGNoaW5nIEFTTCBTdG9yaWVzLiBXZSBoYXZlIHR3byBtYWluIGZhY3RvcnM6CgoxLiBMYW5ndWFnZSAoU2lnbiB2LiBFbmdsaXNoKQoxLiBEaXJlY3Rpb24gKEZvcndhcmQgdi4gUmV2ZXJzZWQpCgpBZ2VzIG9mIGJhYmllcyBhcmUgZnJvbSA1IHRvIDE0Ljk5IG1vbnRocy4gVGhhdCBtZWFucyB3ZSBsb3NlIHR3byAib2xkIiBDT0RBIGJhYmllcyAtIEphbmluZSAoMTYgbW8pIGFuZCB6YTAyICgyMyBtbykuIFRoZSBkYXRhc2V0IGFsc28gY29udGFpbnMgZmFjdG9ycyBmb3IgeW91bmdlciB2LiBvbGRlciBiYWJpZXMgKklGKiB3ZSB3YW50IHRvIGRvIGFnZSBncm91cCBzcGxpdHMuIEkgZG8gbm90IHJlY29tbWVuZCBpdCBiZWNhdXNlIHdlIGxvc2UgYWxsIHNpZ25pZmljYW5jZSB0aGF0IHdheSBhbmQgd2UgaGF2ZSBtb3JlIHByZWNpc2UgYWdlIGluZm9ybWF0aW9uLCBiZXR0ZXIgdGhhbiBicnV0ZSBncm91cHMuICBJRiB3ZSBkbyB1c2UgaXQsIHRoZSBiYWJ5IGFnZSBncm91cHMgYXJlIHN1Y2g6CgoqIFlvdW5nZXIgYmFiaWVzID0gNSB0byA4Ljk5IG1vbnRocwoqIE9sZGVyIGJhYmllcyA9IDkuMCB0byAxNC45OSBtb250aHMKCiMgRGVtb2dyYXBoaWNzCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoZmVhdGhlcikKbGlicmFyeShHR2FsbHkpCgojIEdyYWIgZGF0YSB0aGF0IHdhcyBwcm9kdWNlZCBpbiAwM2ltcG9ydGNsZWFuYmFiaWVzLlJtZApiYWJpZXMgPC0gcmVhZF9mZWF0aGVyKCJjbGVhbmVkYmFieWV5ZWRhdGEuZmVhdGhlciIpICU+JQogIG11dGF0ZShhZ2UgPSBhZ2UqMTIpICU+JQogIHNlbGVjdChwYXJ0aWNpcGFudCwgbGFuZ3VhZ2UsIGFnZSwgZ2VuZGVyLCBzdG9yeSwgZGlyZWN0aW9uLCBtYXJrLCB0cmlhbCwgcmVwZXRpdGlvbiwgYW9pLCBzZWNzLCBwZXJjZW50KSAlPiUKICByZW5hbWUobmFtZSA9IHBhcnRpY2lwYW50KSAlPiUKICBtdXRhdGUoYWdlZ3JvdXAgPSBjYXNlX3doZW4oCiAgICBhZ2UgPD0gOC45OSB+ICJ5b3VuZ2VyIiwKICAgIGFnZSA+PSA5LjAgJiBhZ2UgPCAxNSB+ICJvbGRlciIKICApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZWdyb3VwKSkgJT4lCiAgbXV0YXRlKGxhbmd1YWdlID0gY2FzZV93aGVuKAogICAgbGFuZ3VhZ2UgPT0gImVuZ2xpc2giIH4gIk5TRSIsCiAgICBsYW5ndWFnZSA9PSJzaWduIiB+ICJTRSIKICApKSAlPiUKICByZW5hbWUobGFuZyA9IGxhbmd1YWdlKSAlPiUKICBtdXRhdGUobGFuZzIgPSBjYXNlX3doZW4oCiAgICBuYW1lID09ICJhdWJyZXkgQ09EQSAxMW0iIH4gIkhTRSIsCiAgICBuYW1lID09ICJHZW1tYUZfMTFfNF8xM19DT0RBIiB+ICJIU0UiLAogICAgbmFtZSA9PSAiSGFubmFoX0NPREFfN20iIH4gIkhTRSIsCiAgICBuYW1lID09ICJrZTExZXMxMl83bV9Nb21UZXJwIiB+ICJMU0UiLAogICAgbmFtZSA9PSAiTWlsZXNfMTRtX1NFIiB+ICJIU0UiLAogICAgbmFtZSA9PSAiUGFya2VyIDYgbSBTSUdOSU5HIiB+ICJIU0UiLAogICAgbmFtZSA9PSAiUGVubiA2IG1vbnRocyBTSUdOIEVYUE9TRUQiIH4gIkhTRSIsCiAgICBuYW1lID09ICJUcmluaXR5IDhtIiB+ICJMU0UiLAogICAgbmFtZSA9PSAiVmljdG9yaWEwN18xOF8xNyIgfiAiTFNFIiwKICAgIG5hbWUgPT0gIldlbGxzXzhtb3MiIH4gIkxTRSIsCiAgICBUUlVFIH4gbGFuZwogICkpCiMgIGZpbHRlcihuYW1lICE9ICJWaWN0b3JpYTA3XzE4XzE3IikKCmJhYmllc2luZm8gPC0gYmFiaWVzICU+JQogIHNlbGVjdChuYW1lLCBsYW5nLCBhZ2UsIGdlbmRlcikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBncm91cF9ieShsYW5nKSAlPiUKICBzdW1tYXJpc2UoTiA9IG4oKSwKICAgICAgICAgICAgYWdlX21lYW4gPSBtZWFuKGFnZSksCiAgICAgICAgICAgIHNkID0gc2QoYWdlKSwKICAgICAgICAgICAgbWluID0gbWluKGFnZSksCiAgICAgICAgICAgIG1heCA9IG1heChhZ2UpKQoKZ2VuZGVycyA8LSBiYWJpZXMgJT4lCiAgc2VsZWN0KG5hbWUsIGxhbmcsIGFnZSwgZ2VuZGVyKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGdyb3VwX2J5KGxhbmcsIGdlbmRlcikgJT4lCiAgc3VtbWFyaXNlKE4gPSBuKCkpICU+JQogIHNwcmVhZChnZW5kZXIsIE4pCgpiYWJpZXNpbmZvIDwtIGxlZnRfam9pbihiYWJpZXNpbmZvLCBnZW5kZXJzKSAlPiUKICBzZWxlY3QobGFuZywgTiwgRmVtYWxlLCBNYWxlLCBhZ2VfbWVhbiwgc2QsIG1pbiwgbWF4KSAlPiUKICBwcmludCgpCgpiYWJpZXMkYWdlZ3JvdXAgPC0gZmN0X3JlbGV2ZWwoYmFiaWVzJGFnZWdyb3VwLCBjKCJ5b3VuZ2VyIiwib2xkZXIiKSkKCiMgdC10ZXN0IGZvciBOU0Ugdi4gU0UgYWdlcwpzdW1tYXJ5KGxtKGRhdGEgPSBkaXN0aW5jdChzZWxlY3QoYmFiaWVzLCBhZ2UsIGxhbmcpKSwgYWdlIH4gbGFuZykpCgoKIyBJRiB3ZSBkbyBhZ2UgZ3JvdXBzLCB1c2UgdGhpcyBjb2RlCiMgCiMgYmFiaWVzaW5mbyA8LSBiYWJpZXMgJT4lCiMgICBzZWxlY3QobmFtZSwgbGFuZywgYWdlLCBhZ2Vncm91cCwgZ2VuZGVyKSAlPiUKIyAgIGRpc3RpbmN0KCkgJT4lCiMgICBncm91cF9ieShsYW5nLCBhZ2Vncm91cCkgJT4lCiMgICBzdW1tYXJpc2UoTiA9IG4oKSwKIyAgICAgICAgICAgICBhZ2VfbWVhbiA9IG1lYW4oYWdlKSwKIyAgICAgICAgICAgICBzZCA9IHNkKGFnZSksCiMgICAgICAgICAgICAgbWluID0gbWluKGFnZSksCiMgICAgICAgICAgICAgbWF4ID0gbWF4KGFnZSkpCiMgCiMgZ2VuZGVycyA8LSBiYWJpZXMgJT4lCiMgICBzZWxlY3QobmFtZSwgbGFuZywgYWdlLCBhZ2Vncm91cCwgZ2VuZGVyKSAlPiUKIyAgIGRpc3RpbmN0KCkgJT4lCiMgICBncm91cF9ieShsYW5nLCBhZ2Vncm91cCwgZ2VuZGVyKSAlPiUKIyAgIHN1bW1hcmlzZShOID0gbigpKSAlPiUKIyAgIHNwcmVhZChnZW5kZXIsIE4pCiMgCiMgYmFiaWVzaW5mbyA8LSBsZWZ0X2pvaW4oYmFiaWVzaW5mbywgZ2VuZGVycykgJT4lCiMgICBzZWxlY3QobGFuZywgYWdlZ3JvdXAsIE4sIEZlbWFsZSwgTWFsZSwgYWdlX21lYW4sIHNkLCBtaW4sIG1heCkgJT4lCiMgICBwcmludCgpCgpgYGAKCiMgR2xvYmFsIExvb2tpbmcKCldlIGNhbGN1bGF0ZWQgcGVyY2VudGFnZXMgKmJhc2VkIG9uIG92ZXJhbGwgY2xpcCBsZW5ndGgqIGFzIHRoZSBkZW5vbWluYXRvci4gSW4gdGhpcyB3YXksIHdlIGNhbiBtZWFuaW5nZnVsbHkgY29udHJhc3QgbG9va2luZyB0aW1lcyBhdCB0aGUgdmlkZW9zICh3aGljaCBhcmUgdmFyaWFibGUgbGVuZ3RocykgYmFzZWQgb24gZGlmZmVyZW50IGZhY3RvcnMuIEJ1dCB3aGVuIHdlIGdvIHRvIEFPSSBhbmFseXNpcyB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgcGVyY2VudGFnZXMgc28gdGhlIGRlbm9taW5hdG9yIGlzIGJhc2VkIG9uIHRvdGFsIGxvb2tpbmcgdGltZSwgbm90IG92ZXJhbGwgY2xpcCBsZW5ndGguIAoKVGhlIGNoYXJ0IGJlbG93IHNob3dzIGxpdHRsZSBkaWZmZXJlbmNlcyBiYXNlZCBvbiBmYWN0b3JzIEFnZSwgTGFuZ3VhZ2UsIG9yIERpcmVjdGlvbi4gVGhhdCdzIGdvb2QsIG1lYW5zIHRoZSB2aWRlb3Mgd2VyZSBlcXVhbGx5IGVuZ2FnaW5nIGZvciBhbGwgYmFiaWVzLCByaWdodD8gCgpgYGB7cn0KYmFiaWVzJGxhbmcgPC0gYXMuZmFjdG9yKGJhYmllcyRsYW5nKQpiYWJpZXNfb3ZlcmFsbF9sb29raW5nIDwtIGJhYmllcyAlPiUKICBncm91cF9ieShuYW1lLCBhZ2UsIGxhbmcsIGRpcmVjdGlvbiwgc3RvcnksIHJlcGV0aXRpb24pICU+JQogIHN1bW1hcmlzZShwZXJjZW50ID0gc3VtKHBlcmNlbnQpKSAjIGdldHMgdG90YWwgbG9va2luZyBwZXJjZW50IGZvciBlYWNoIHRyaWFsIGZvciBlYWNoIGJhYnkKCiMgVGFibGUgb2YgbWVhbnMKYmFiaWVzX292ZXJhbGxfbG9va2luZyAlPiUgCiAgZ3JvdXBfYnkobmFtZSwgbGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCkpICU+JSAjIGdldCBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UobWVhbl9wZXJjZW50ID0gbWVhbihwZXJjZW50KSwKICAgICAgICAgICAgY291bnQgPSBuKCksCiAgICAgICAgICAgIHNkID0gc2QocGVyY2VudCksCiAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpICU+JQogIHNlbGVjdCgtc2QpICU+JQogIHByaW50KCkKCmdncGxvdChiYWJpZXNfb3ZlcmFsbF9sb29raW5nLCBhZXMoeCA9IGFnZSwgeSA9IHBlcmNlbnQsIGNvbG9yID0gZGlyZWN0aW9uLCBmaWxsID0gZGlyZWN0aW9uKSkgKyAKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSkgKwogIGZhY2V0X2dyaWQoLiB+IGxhbmcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgZ2d0aXRsZSgiVmlkZW8gQXR0ZW50aW9uIikgKwogIHhsYWIoImFnZSAobW9udGhzKSIpICsKICB5bGFiKCJwZXJjZW50IGxvb2tpbmciKSArIAogIHRoZW1lX2J3KCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBwZXJjZW50KSAKCgojIFBsb3QKIyBiYWJpZXNfb3ZlcmFsbF9sb29raW5nICU+JSAKIyAgIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbiwgbmFtZSkgJT4lCiMgICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCkpICU+JSAjIGdldHMgYXZlcmFnZSBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggYmFieQojICAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKIyAgIHN1bW1hcmlzZShtZWFuX3BlcmNlbnQgPSBtZWFuKHBlcmNlbnQpLCAjIGdldHMgZ3JvdXAgYXZlcmFnZXMKIyAgICAgICAgICAgICBjb3VudCA9IG4oKSwKIyAgICAgICAgICAgICBzZCA9IHNkKHBlcmNlbnQpLAojICAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpICU+JSAKIyAgIGdncGxvdChhZXMoeCA9IGxhbmcsIHkgPSBtZWFuX3BlcmNlbnQsIGZpbGwgPSBkaXJlY3Rpb24pKSArIAojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIAojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW5fcGVyY2VudCAtIHNlLCB5bWF4ID0gbWVhbl9wZXJjZW50ICsgc2UpLCAKIyAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHdpZHRoID0gMC4yNSkgKyAKIyAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHBlcmNlbnQpICsKIyAgIHRoZW1lX21pbmltYWwoKSArIAojICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiMgIyAgZmFjZXRfd3JhcCgibGFuZyIpICsKIyAgIGdndGl0bGUoIlZpZGVvIEF0dGVudGlvbiIpICsKIyAgIHhsYWIoIiIpICsKIyAgIHlsYWIoInBlcmNlbnQgbG9va2luZyIpCgojIGJhYmllc19vdmVyYWxsX2xvb2tpbmcgJT4lCiMgICBnZ3Bsb3QoYWVzKHggPSBsYW5nLCB5ID0gcGVyY2VudCwgZmlsbCA9IGRpcmVjdGlvbikpICsKIyAgIGZhY2V0X3dyYXAoImFnZWdyb3VwIikgKyAKIyAgIGdlb21fdmlvbGluKCkKYGBgCgpBIGxpbmVhciBtb2RlbCBzaG93cyB0aGVyZSB3ZXJlIG5vIHNpZ25pZmljYW50IGVmZmVjdHMgb2YgYW55IGZhY3RvcnMuIFdlIGNhbiBjb25jbHVkZSB0aGVyZSB3YXMgbm8gZWZmZWN0IG9uIGhvdyAqbXVjaCogdGhlIGJhYmllcyBsb29rZWQgYXQgdGhlIHN0aW11bGkuICAKCmBgYHtyfQpnbG9iYWxfbG0gPC0gbG1lcihwZXJjZW50IH4gYWdlICsgbGFuZyAqIGRpcmVjdGlvbiArIChkaXJlY3Rpb258bmFtZSkgKyAoZGlyZWN0aW9ufHN0b3J5KSwgZGF0YSA9IGJhYmllc19vdmVyYWxsX2xvb2tpbmcpCnN1bW1hcnkoZ2xvYmFsX2xtKSAKY29uZmludChnbG9iYWxfbG0pCiNnZ2NvZWYoZ2xvYmFsX2xtKQpgYGAKCiMgQU9JIExvb2tpbmcKTm93IHdlJ2xsIHJlLWNhbGN1bGF0ZSB0aGUgcGVyY2VudGFnZXMgc28gdGhlIGRlbm9taW5hdG9yIGlzIGJhc2VkIG9uIHRvdGFsIGxvb2tpbmcgdGltZS4gQWxsIEFPSXMgc2hvdWxkIHN1bSB1cCB0byAxMDAlIGZvciBlYWNoIHRyaWFsIGFuZCBlYWNoIGJhYnkuIE5leHQgbGV0J3MgbWFrZSBhIGJveHBsb3Qgb2YgYWxsIEFPSXMuIAoKYGBge3J9CiNSZWNhbGN1bGF0ZSBwZXJjZW50CmJhYmllcyA8LSBiYWJpZXMgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCgtcGVyY2VudCkgJT4lCiAgZ3JvdXBfYnkobmFtZSwgbGFuZywgYWdlZ3JvdXAsIGFnZSwgZGlyZWN0aW9uLCBzdG9yeSwgbWFyaywgdHJpYWwsIHJlcGV0aXRpb24sIGdlbmRlcikgJT4lCiAgbXV0YXRlKHRvdGFsc2VjID0gc3VtKHNlY3MpKSAlPiUKICBncm91cF9ieShuYW1lLCBsYW5nLCBhZ2Vncm91cCwgYWdlLCBkaXJlY3Rpb24sIHN0b3J5LCBtYXJrLCB0cmlhbCwgcmVwZXRpdGlvbiwgZ2VuZGVyLCBhb2kpICU+JQogIG11dGF0ZShwZXJjZW50ID0gc2Vjcy90b3RhbHNlYykKCiMgQm94cGxvdApiYWJpZXMgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYW9pLCB5ID0gcGVyY2VudCwgZmlsbCA9IGRpcmVjdGlvbikpICsgCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdndGl0bGUoIkFPSSBBdHRlbnRpb24iKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHMgPSBjKDAsMSkpCmBgYApJdCBhcHBlYXJzIHR3byBpbXBvcnRhbnQgQU9JcyBhcmUgTWlkQ2hlc3RUb3AgYW5kIE1pZEZhY2VCb3R0b20uIExldCdzIGxvb2sgYWdhaW4gb25seSBhdCBtaWRsaW5lIEFPSXM6CgpgYGB7cn0KbWlkbGluZSA9IGMoIkJlbGx5IiwiQmVsb3dDaGVzdCIsIk1pZENoZXN0Qm90dG9tIiwiTWlkQ2hlc3RDZW50ZXIiLCJNaWRDaGVzdFRvcCIsCiAgICAgICAgICAgICJNaWRGYWNlQm90dG9tIiwiTWlkRmFjZUNlbnRlciIsIk1pZEZhY2VUb3AiKQpiYWJpZXMgJT4lCiAgZmlsdGVyKGFvaSAlaW4lIG1pZGxpbmUpICU+JQogIGdncGxvdChhZXMoeCA9IGFvaSwgeSA9IHBlcmNlbnQsIGZpbGwgPSBkaXJlY3Rpb24pKSArIAogIGdlb21fYm94cGxvdCgpICsKICBnZ3RpdGxlKCJNaWRsaW5lIEFPSSBBdHRlbnRpb24iKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHMgPSBjKDAsMSkpCmBgYAoKSSdtIGdvaW5nIHRvIHJ1biBsaW5lYXIgbW9kZWxzIHdpdGggb25seSBNaWRDaGVzdFRvcCBvciBNaWRGYWNlQm90dG9tLCBhbmQgc2VlIHdoYXQgaGFwcGVucy4gTm8gYWdlIGludGVyYWN0aW9ucy4KCioqTWlkQ2hlc3RUb3A6KioKCiogU2lnbmlmaWNhbnQgZWZmZWN0IG9mIGFnZSAocCA9IDAuMDAyKSAtIG9sZGVyIGJhYmllcyBsb29rIGF0IE1pZENoZXN0VG9wIEFPSSBtb3JlLgoqIFNpZ25pZmljYW50IGVmZmVjdCBvZiBsYW5ndWFnZSAocCA9IDAuMDEwKSAtIE5TRSBiYWJpZXMgbG9vayArMTMuNiUgbW9yZSB0aGFuIFNFIGJhYmllcy4gCiogU2lnbmlmaWNhbnQgZWZmZWN0IG9mIGRpcmVjdGlvbiAocCA9IDAuMDQ2KSAtIEJhYmllcyBsb29rIGFib3V0IDQuNSUgbGVzcyBmb3IgcmV2ZXJzZWQKKiBObyBsYW5ndWFnZSBYIGRpcmVjdGlvbiBpbnRlcmFjdGlvbi4gCiAKKipNaWRGYWNlQm90dG9tOioqIAoKKiBObyBlZmZlY3Qgb2YgYWdlCiogU2lnbmlmaWNhbnQgZWZmZWN0IG9mIGxhbmd1YWdlIChwID0gMC4wMDUpIC0gU0UgYmFiaWVzIGxvb2sgKzE5JSBtb3JlIHRoYW4gTlNFIGJhYmllcy4KKiBNYXJnaW5hbCBlZmZlY3Qgb2YgbGFuZ3VhZ2UgKHAgPSAwLjEwNCkgLSBCYWJpZXMgbG9vayBhYm91dCAzJSBtb3JlIGZvciByZXZlcnNlZC4gCiogTm8gbGFuZ3VhZ2UgWCBkaXJlY3Rpb24gaW50ZXJhY3Rpb24uCgpgYGB7cn0KYmFiaWVzICU+JQogIGZpbHRlcihhb2kgJWluJSBjKCJNaWRGYWNlQm90dG9tIiwiTWlkQ2hlc3RUb3AiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gcGVyY2VudCwgY29sb3IgPSBkaXJlY3Rpb24sIGZpbGwgPSBkaXJlY3Rpb24pKSArIAogIGdlb21faml0dGVyKGFscGhhID0gMC41KSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBwZXJjZW50KSArCiAgdGhlbWVfYncoKSArIAojICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF9ncmlkKGFvaSB+IGxhbmcpICsKICBnZ3RpdGxlKCJBT0kgQXR0ZW50aW9uIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJwZXJjZW50IGxvb2tpbmciKQoKbWlkY2hlc3R0b3BfbG0gPC0gbG1lcihwZXJjZW50IH4gYWdlICsgbGFuZyAqIGRpcmVjdGlvbiArICgxfG5hbWUpICsgKDF8c3RvcnkpLCBkYXRhID0gZmlsdGVyKGJhYmllcywgYW9pID09ICJNaWRDaGVzdFRvcCIpKQpzdW1tYXJ5KG1pZGNoZXN0dG9wX2xtKQpjb25maW50KG1pZGNoZXN0dG9wX2xtKQojZ2djb2VmKG1pZGNoZXN0dG9wX2xtKQoKbWlkZmFjZWJvdHRvbV9sbSA8LSBsbWVyKHBlcmNlbnQgfiBhZ2UgKyBsYW5nICogZGlyZWN0aW9uICsgKDF8bmFtZSkgKyAoMXxzdG9yeSksIGRhdGEgPSBmaWx0ZXIoYmFiaWVzLCBhb2kgPT0gIk1pZEZhY2VCb3R0b20iKSkKc3VtbWFyeShtaWRmYWNlYm90dG9tX2xtKQpjb25maW50KG1pZGZhY2Vib3R0b21fbG0pCiNnZ2NvZWYobWlkZmFjZWJvdHRvbV9sbSkKCiMgQmFyIGNoYXJ0CiMgYmFiaWVzICU+JQojICAgZmlsdGVyKGFvaSAlaW4lIGMoIk1pZEZhY2VCb3R0b20iLCJNaWRDaGVzdFRvcCIpKSAlPiUKIyAgIGdyb3VwX2J5KGFnZWdyb3VwLCBsYW5nLCBkaXJlY3Rpb24sIG5hbWUsIGFvaSkgJT4lCiMgICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCkpICU+JSAjIGdldHMgYXZlcmFnZSBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggYmFieQojICAgZ3JvdXBfYnkoYWdlZ3JvdXAsIGxhbmcsIGRpcmVjdGlvbiwgYW9pKSAlPiUKIyAgIHN1bW1hcmlzZShtZWFuX3BlcmNlbnQgPSBtZWFuKHBlcmNlbnQpLCAjIGdldHMgZ3JvdXAgYXZlcmFnZXMKIyAgICAgICAgICAgICBjb3VudCA9IG4oKSwKIyAgICAgICAgICAgICBzZCA9IHNkKHBlcmNlbnQpLAojICAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpICU+JSAKIyAgIGdncGxvdChhZXMoeCA9IGxhbmcsIHkgPSBtZWFuX3BlcmNlbnQsIGZpbGwgPSBkaXJlY3Rpb24pKSArIAojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIAojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW5fcGVyY2VudCAtIHNlLCB5bWF4ID0gbWVhbl9wZXJjZW50ICsgc2UpLCAKIyAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHdpZHRoID0gMC4yNSkgKyAKIyAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHBlcmNlbnQpICsKIyAgIHRoZW1lX21pbmltYWwoKSArIAojICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiMgICBmYWNldF9ncmlkKGFvaSB+IGFnZWdyb3VwKSArCiMgICBnZ3RpdGxlKCJWaWRlbyBBdHRlbnRpb24iKSArCiMgICB4bGFiKCIiKSArCiMgICB5bGFiKCJwZXJjZW50IGxvb2tpbmciKQpgYGAKCgojIEZhY2UtQ2hlc3QgUmF0aW8KTmV4dCwgd2UnbGwgZGVmaW5lIGEgRmFjZS1DaGVzdCBSYXRpbyAoRkNSKSBzdWNoIHRoYXQ6CgoxLiBNaWRGYWNlQ2VudGVyLCBNaWRGYWNlQm90dG9tID0gRmFjZQoxLiBNaWRDaGVzdFRvcCwgTWlkQ2hlc3RDZW50ZXIsIE1pZENoZXN0Qm90dG9tLCBCZWxvd0NoZXN0ID0gQ2hlc3QKMS4gRkNSID0gZmFjZSAtIGNoZXN0IC8gZmFjZSArIGNoZXN0CgpXZSBkaWQgbm90IGluY2x1ZGUgQmVsbHkgb3IgTWlkRmFjZVRvcCBiZWNhdXNlIG9mIHZlcnkgbG93IGxvb2tpbmcgcmF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBib3hwbG90cyBhYm92ZS4KCmBgYHtyfQpiYWJpZXNfZmNyIDwtIGJhYmllcyAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc3ByZWFkKGFvaSwgcGVyY2VudCkgJT4lCiAgZ3JvdXBfYnkobmFtZSwgYWdlLCBhZ2Vncm91cCwgbGFuZywgZ2VuZGVyLCBkaXJlY3Rpb24sIHN0b3J5LCByZXBldGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoZmFjZSA9IHN1bShNaWRGYWNlQ2VudGVyLCBNaWRGYWNlQm90dG9tLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBjaGVzdCA9IHN1bShNaWRDaGVzdFRvcCwgTWlkQ2hlc3RDZW50ZXIsIE1pZENoZXN0Qm90dG9tLCBCZWxvd0NoZXN0LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBmY3IgPSAoZmFjZSAtIGNoZXN0KSAvIChmYWNlICsgY2hlc3QpKQoKIyBUYWJsZSBvZiBtZWFucwpiYWJpZXNfZmNyICU+JSAKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24sIG5hbWUpICU+JQogIHN1bW1hcmlzZShmY3IgPSBtZWFuKGZjcikpICU+JSAjIGdldHMgYXZlcmFnZSBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggYmFieQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZmNyID0gbWVhbihmY3IpLCAjIGdldHMgZ3JvdXAgYXZlcmFnZXMKICAgICAgICAgICAgY291bnQgPSBuKCksCiAgICAgICAgICAgIHNkID0gc2QoZmNyKSwKICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KGNvdW50KSkgJT4lCiAgc2VsZWN0KC1zZCkgJT4lCiAgcHJpbnQoKQoKYmFiaWVzX2ZjciAlPiUgCiAgZ3JvdXBfYnkobGFuZywgbmFtZSkgJT4lCiAgc3VtbWFyaXNlKGZjciA9IG1lYW4oZmNyKSkgJT4lICMgZ2V0cyBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiAgZ3JvdXBfYnkobGFuZykgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZmNyID0gbWVhbihmY3IpLCAjIGdldHMgZ3JvdXAgYXZlcmFnZXMKICAgICAgICAgICAgY291bnQgPSBuKCksCiAgICAgICAgICAgIHNkID0gc2QoZmNyKSwKICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KGNvdW50KSkgJT4lCiAgc2VsZWN0KC1zZCkgJT4lCiAgcHJpbnQoKQoKCiMgUGxvdApnZ3Bsb3QoYmFiaWVzX2ZjciwgYWVzKHggPSBhZ2UsIHkgPSBmY3IsIGNvbG9yID0gZGlyZWN0aW9uLCBmaWxsID0gZGlyZWN0aW9uKSkgKyAKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsMSkpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZmFjZXRfZ3JpZCguIH4gbGFuZykgKwogIGdndGl0bGUoIkZhY2UtQ2hlc3QgUmF0aW9zIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJGQ1IiKQoKIyBCYXIgY2hhcnQKIyBiYWJpZXNfZmNyICU+JSAKIyAgIGdyb3VwX2J5KGFnZWdyb3VwLCBsYW5nLCBkaXJlY3Rpb24sIG5hbWUpICU+JQojICAgc3VtbWFyaXNlKGZjciA9IG1lYW4oZmNyKSkgJT4lICMgZ2V0cyBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiMgICBncm91cF9ieShhZ2Vncm91cCwgbGFuZywgZGlyZWN0aW9uKSAlPiUKIyAgIHN1bW1hcmlzZShtZWFuX2ZjciA9IG1lYW4oZmNyKSwgIyBnZXRzIGdyb3VwIGF2ZXJhZ2VzCiMgICAgICAgICAgICAgY291bnQgPSBuKCksCiMgICAgICAgICAgICAgc2QgPSBzZChmY3IpLAojICAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpICU+JSAKIyAgIGdncGxvdChhZXMoeCA9IGxhbmcsIHkgPSBtZWFuX2ZjciwgZmlsbCA9IGRpcmVjdGlvbikpICsgCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsgCiMgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl9mY3IgLSBzZSwgeW1heCA9IG1lYW5fZmNyICsgc2UpLCAKIyAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHdpZHRoID0gMC4yNSkgKyAKIyAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xLDEpKSArCiMgICB0aGVtZV9taW5pbWFsKCkgKyAKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgZmFjZXRfd3JhcCgiYWdlZ3JvdXAiKSArCiMgICBnZ3RpdGxlKCJGYWNlLUNoZXN0IFJhdGlvcyIpICsKIyAgIHhsYWIoIiIpICsKIyAgIHlsYWIoIkZDUiIpCmBgYAoKV2hhdCB3aWxsIGEgbGluZWFyIG1peGVkIG1vZGVsIHRlbGwgdXM/ICh3aXRoIG5vIGFnZSBpbnRlcmFjdGlvbnMpCgoqIE5vIGVmZmVjdCBvZiBhZ2UuIEludGVyZXN0aW5nLiBNYXliZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhhdCBtYW55IGJhYmllcy4gCiogU3Ryb25nIGVmZmVjdCBvZiBsYW5ndWFnZTogU0UgYmFiaWVzIGhhdmUgb3ZlcmFsbCArMC40MyBGQ1IgdGhhbiBOU0UgYmFiaWVzIChwID0gMC4wMSk7IGluIG90aGVyIHdvcmRzLCB0aGV5IGFyZSBtb3JlIGF0dHJhY3RlZCB0byB0aGUgZmFjZS4gCiogRWZmZWN0IG9mIGRpcmVjdGlvbjogUmV2ZXJzYWwgKmluY3JlYXNlcyogRkNSIGJ5ICswLjEyIGFjcm9zcyBhbGwgYmFiaWVzIChwID0gMC4wMzkpLiBJbnRlcmVzdGluZy4KKiBXZWFrIGxhbmd1YWdlIHggZGlyZWN0aW9uIGludGVyYWN0aW9uLiBJdCBzZWVtcyBOU0UgYmFiaWVzIGhhdmUgYSBiaWdnZXIgcmV2ZXJzYWwgZWZmZWN0IHRoYW4gU0UgYmFiaWVzPyBUcnlpbmcgdG8ganVkZ2UgZnJvbSB0aGUgaGVhdCBtYXBzLiAocCA9IDAuMTA0OSkuIEJ1dCBpdCdzIHNvIHdlYWsgc28gcG9zc2libHkgbm90IHdvcnRoIG1lbnRpb25pbmcuCgpgYGB7cn0KZmNyX2xtIDwtIGxtZXIoZmNyIH4gYWdlICsgbGFuZyAqIGRpcmVjdGlvbiArICgxfG5hbWUpICsgKDF8c3RvcnkpLCBkYXRhID0gYmFiaWVzX2ZjcikKc3VtbWFyeShmY3JfbG0pCmNvbmZpbnQoZmNyX2xtKQoKIyBodHRwczovL2pvZnJod2xkLmdpdGh1Yi5pby90ZWFjaGluZy9jb3Vyc2VzLzIwMTdfbHNhL2xlY3R1cmVzL1Nlc3Npb25fOC5uYi5odG1sCiMgbGlicmFyeShib290KQojIGZjcl9ib290IDwtIGJvb3RNZXIoZmNyX2xtLCBGVU4gPSBmaXhlZiwgbnNpbSA9IDEwMDApCiMgZmNyX2Jvb3QKIyBib290LmNpKGZjcl9ib290LCBpbmRleCA9IDMsIHR5cGUgPSAicGVyYyIpCgojZ2djb2VmKGZjcl9sbSkKCiNlbW1lYW5zOjplbW1lYW5zKGZjcl9sbSwgbGlzdChwYWlyd2lzZSB+IGRpcmVjdGlvbipsYW5nKSwgYWRqdXN0ID0gIm5vbmUiKQoKIyBmY3JzZV9sbSA8LSBsbWVyKGZjciB+IGFnZSArIGRpcmVjdGlvbiArICgxfG5hbWUpICsgKDF8c3RvcnkpLCBkYXRhID0gZmlsdGVyKGJhYmllc19mY3IsIGxhbmcgPT0gIlNFIikpCiMgZmNybnNlX2xtIDwtIGxtZXIoZmNyIH4gYWdlICsgZGlyZWN0aW9uICsgKDF8bmFtZSkgKyAoMXxzdG9yeSksIGRhdGEgPSBmaWx0ZXIoYmFiaWVzX2ZjciwgbGFuZyA9PSAiTlNFIikpCiMgc3VtbWFyeShmY3JzZV9sbSkKIyBzdW1tYXJ5KGZjcm5zZV9sbSkKYGBgCgojIFRoZSBMYXJnZSBUYWJsZQoKPiBJIHdvdWxkIGxpa2UgYSBsYXJnZSB0YWJsZSB3aXRoIGFsbCBpbmRpdmlkdWFsIHBlcmNlbnQgbG9va2luZyBtZWFucyBmb3IgZWFjaCBBT0kgYW5kIHRoZSBpbmRpdmlkdWFsIEZDUiB2YWx1ZXMsIHdpdGggYWdlcywgZ2VuZGVyLCB2aWRlbyBncm91cCBmb3IgZWFjaCBjaGlsZC4gIChjb2xsYXBzZWQgYWNyb3NzIHN0b3JpZXMgYW5kIHRyaWFscykgIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBiYWJpZXMgaGFzIHRoZSBBT0kgaW5mbywgYmFiaWVzX2ZjciBoYXMgRkNSCiMgQ29sbGFwc2UgYWNyb3NzIHN0b3JpZXMgYW5kIHRyaWFscyAKCmJhYmllc19zcHJlYWQgPC0gYmFiaWVzICU+JQogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGFnZSwgZ2VuZGVyLCBkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtID0gVCkpICU+JQogIHNwcmVhZChhb2ksIHBlcmNlbnQpCgpiYWJpZXNfZmNyX3NwcmVhZCA8LSBiYWJpZXNfZmNyICU+JQogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGFnZSwgZ2VuZGVyLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShmY3IgPSBtZWFuKGZjciwgbmEucm0gPSBUKSkKCmJhYmllc19sYXJnZV90YWJsZSA8LSBiYWJpZXNfc3ByZWFkICU+JQogIGxlZnRfam9pbihiYWJpZXNfZmNyX3NwcmVhZCkKCmJhYmllc19sYXJnZV90YWJsZSAlPiUKICB3cml0ZV9jc3YoImxhcmdlX3RhYmxlX2JhYmllcy5jc3YiKQpgYGAKCgojIEhlYXQgTWFwcwpBbmQgbm93IGhlYXQgbWFwcyEKCmBgYHtyfQpoZWF0bWFwX2JhYmllcyA8LSBiYWJpZXMgJT4lCiAgZmlsdGVyKGFvaSAlaW4lIG1pZGxpbmUpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShsYW5nLCBuYW1lLCBkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGFvaSA9IGZhY3Rvcihhb2ksIGxldmVscyA9IGMoIkJlbGx5IiwiQmVsb3dDaGVzdCIsIk1pZENoZXN0Qm90dG9tIiwiTWlkQ2hlc3RDZW50ZXIiLCJNaWRDaGVzdFRvcCIsCiAgICAgICAgICAgICJNaWRGYWNlQm90dG9tIiwiTWlkRmFjZUNlbnRlciIsIk1pZEZhY2VUb3AiKSkpCgpnZ3Bsb3QoaGVhdG1hcF9iYWJpZXMsIGFlcyh4ID0gbGFuZywgeSA9IGFvaSkpICsKICBnZW9tX3RpbGUoYWVzKGZpbGw9cGVyY2VudCksY29sb3I9ImxpZ2h0Z3JheSIsbmEucm09VFJVRSkgKyAKIyAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJ2aXJpZGlzIiwgZGlyZWN0aW9uPS0xLCBsaW1pdHMgPSBjKDAsLjcpLCBsYWJlbHMgPSBwZXJjZW50LCBuYW1lID0gImxvb2tpbmcgdGltZSIpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIiNmZmZmZmYiLCBoaWdoID0gIiMwODUxOWMiLCBzcGFjZSA9ICJMYWIiLCBsaW1pdHMgPSBjKDAsLjQ1MDEpLCBsYWJlbHMgPSBwZXJjZW50LCBuYW1lID0gImxvb2tpbmcgdGltZSIsIG5hLnZhbHVlID0gImdyZXk1MCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBjb2xvciA9ICJibGFjayIsIGZhY2UgPSAiaXRhbGljIiksIAogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gIndoaXRlIiwgZmlsbCA9ICJ3aGl0ZSIpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAid2hpdGUiKSkgKwogIGZhY2V0X2dyaWQoLiB+IGRpcmVjdGlvbikgKwogIHlsYWIoIiIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCJFeWUgR2F6ZSBIZWF0IE1hcCwgYnkgRGlyZWN0aW9uIikgKyAKICBzY2FsZV95X2Rpc2NyZXRlKGV4cGFuZD1jKDAsMCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwwKSkKCmdncGxvdChoZWF0bWFwX2JhYmllcywgYWVzKHggPSBkaXJlY3Rpb24sIHkgPSBhb2kpKSArCiAgZ2VvbV90aWxlKGFlcyhmaWxsPXBlcmNlbnQpLGNvbG9yPSJsaWdodGdyYXkiLG5hLnJtPVRSVUUpICsgCiMgIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAidmlyaWRpcyIsIGRpcmVjdGlvbj0tMSwgbGltaXRzID0gYygwLC43KSwgbGFiZWxzID0gcGVyY2VudCwgbmFtZSA9ICJsb29raW5nIHRpbWUiKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICIjZmZmZmZmIiwgaGlnaCA9ICIjMDg1MTljIiwgc3BhY2UgPSAiTGFiIiwgbGltaXRzID0gYygwLC40NTAxKSwgbGFiZWxzID0gcGVyY2VudCwgbmFtZSA9ICJsb29raW5nIHRpbWUiLCBuYS52YWx1ZSA9ICJncmV5NTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgY29sb3IgPSAiYmxhY2siLCBmYWNlID0gIml0YWxpYyIpLCAKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIndoaXRlIikpICsKICBmYWNldF9ncmlkKC4gfiBsYW5nKSArCiAgeWxhYigiIikgKyB4bGFiKCIiKSArIGdndGl0bGUoIkV5ZSBHYXplIEhlYXQgTWFwLCBieSBMYW5ndWFnZSIpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQ9YygwLDApKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCkpCmBgYAoKIyMgQ29sbGFwc2VkIGJ5IGRpcmVjdGlvbiAobmV3KQoKYGBge3J9CmhlYXRtYXBfYmFiaWVzMiA8LSBiYWJpZXMgJT4lCiAgZmlsdGVyKGFvaSAlaW4lIG1pZGxpbmUpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShsYW5nLCBuYW1lLCBhb2kpICU+JQogIHN1bW1hcmlzZShwZXJjZW50ID0gbWVhbihwZXJjZW50LCBuYS5ybT1UUlVFKSkgJT4lCiAgZ3JvdXBfYnkobGFuZywgYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm09VFJVRSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoYW9pID0gZmFjdG9yKGFvaSwgbGV2ZWxzID0gYygiQmVsbHkiLCJCZWxvd0NoZXN0IiwiTWlkQ2hlc3RCb3R0b20iLCJNaWRDaGVzdENlbnRlciIsIk1pZENoZXN0VG9wIiwKICAgICAgICAgICAgIk1pZEZhY2VCb3R0b20iLCJNaWRGYWNlQ2VudGVyIiwiTWlkRmFjZVRvcCIpKSkKCgpnZ3Bsb3QoaGVhdG1hcF9iYWJpZXMyLCBhZXMoeCA9IGxhbmcsIHkgPSBhb2kpKSArCiAgZ2VvbV90aWxlKGFlcyhmaWxsPXBlcmNlbnQpLGNvbG9yPSJsaWdodGdyYXkiLG5hLnJtPVRSVUUpICsgCiMgIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAidmlyaWRpcyIsIGRpcmVjdGlvbj0tMSwgbGltaXRzID0gYygwLC43KSwgbGFiZWxzID0gcGVyY2VudCwgbmFtZSA9ICJsb29raW5nIHRpbWUiKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICIjZmZmZmZmIiwgaGlnaCA9ICIjMDg1MTljIiwgc3BhY2UgPSAiTGFiIiwgbGltaXRzID0gYygwLC40NTAxKSwgbGFiZWxzID0gcGVyY2VudCwgbmFtZSA9ICJsb29raW5nIHRpbWUiLCBuYS52YWx1ZSA9ICJncmV5NTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgY29sb3IgPSAiYmxhY2siLCBmYWNlID0gIml0YWxpYyIpLCAKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIndoaXRlIikpICsKICB5bGFiKCIiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiRXllIEdhemUgSGVhdCBNYXAsIGJ5IExhbmd1YWdlIChDb2xsYXBzZWQgYnkgRGlyZWN0aW9uKSIpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQ9YygwLDApKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCkpCmBgYAoKIyMgRm9yIHBvc3Rlcj8KCmBgYHtyIGZpZy53aWR0aCA9IDYuNSwgZmlnLmhlaWdodCA9IDZ9CmdncGxvdChoZWF0bWFwX2JhYmllcywgYWVzKHggPSBkaXJlY3Rpb24sIHkgPSBhb2kpKSArCiAgZ2VvbV90aWxlKGFlcyhmaWxsID0gcGVyY2VudCksIAogICAgICAgICAgICBjb2xvcj0iZGFyayBncmF5IiwgCiAgICAgICAgICAgIHNpemUgPSAwLjI1LCAKICAgICAgICAgICAgbmEucm0gPSBULCAKICAgICAgICAgICAgaGVpZ2h0ID0gcmVwKGMoMTAsNCwxLDEsMSwxLDEsMSksNCkpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiI2ZmZmZmZiIsIAogICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICIjMDg1MTljIiwgCiAgICAgICAgICAgICAgICAgICAgICBzcGFjZSA9ICJMYWIiLCAKICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwuNDUwMSksIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudCwgCiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gImxvb2tpbmcgdGltZSIsIAogICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTUwIikgKwogIGZhY2V0X2dyaWQoLiB+IGxhbmcpICsKICB5bGFiKCIiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiRXllIEdhemUgSGVhdCBNYXAsIGJ5IExhbmd1YWdlIikgKyAKICBzY2FsZV95X2Rpc2NyZXRlKGV4cGFuZD1jKDAsMCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZD1jKDAsMCkpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFtaWx5ID0gInhrY2QiKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3Qoc2l6ZSA9IDIpLAogICAgICAgIHRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIAogIGd1aWRlcyhjb2xvciA9IEZBTFNFLCBmaWxsID0gRkFMU0UpCmBgYAoKIyBEaWZmZXJlbnQgV2F5cyB0byBWaXN1YWxpemUgUmV2ZXJzYWwKSSB3YW50IHRvIHRyeSB0byB2aXN1YWxpemUgcmV2ZXJzYWwgZWZmZWN0cyBhIGRpZmZlcmVudCB3YXkuIE1heWJlIHRoaXMuIAoKYGBge3J9CiMgR2V0IHBhcnRpY2lwYW50LWxldmVsIGRhdGEKYmFiaWVzX2ZjcjIgPC0gYmFiaWVzX2ZjciAlPiUKICBncm91cF9ieShuYW1lLCBhZ2UsIGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGZjciA9IG1lYW4oZmNyKSkKCiMgcmV2ZXJzYWxfZWZmZWN0X2xtIDwtIGxtZXIoZmNyIH4gYWdlICsgbGFuZyAqIGRpcmVjdGlvbiArICgxfG5hbWUpLCBkYXRhID0gYmFiaWVzX2ZjcjIpCiMgc3VtbWFyeShyZXZlcnNhbF9lZmZlY3RfbG0pCgpnZ3Bsb3QoYmFiaWVzX2ZjcjIsIGFlcyh4ID0gZGlyZWN0aW9uLCB5ID0gZmNyLCBjb2xvciA9IGxhbmcsIGZpbGwgPSBsYW5nKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IG5hbWUpKSArCiAgZmFjZXRfZ3JpZCguIH4gbGFuZykgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxKSkgKwogIHRoZW1lX2J3KCkKCmBgYAoKT3IgYSByZXZlcnNhbCBlZmZlY3QgY2hhcnQ/IE9rYXksIHNvIHRoaXMgY2hhcnQgdGVsbHMgdXMgb3ZlcmFsbCB0aGVyZSByZWFsbHkgd2Fzbid0IG11Y2ggb2YgYSByZXZlcnNhbCBlZmZlY3QgZm9yIFNFIGJhYmllcywgdGhleSdyZSBhbGwgaG92ZXJpbmcgYXJvdW5kIDAuIEludGVyZXN0aW5nLiBXaGlsZSB0aGVyZSBzZWVtcyB0byBiZSBhIHJldmVyc2FsIGVmZmVjdCBmb3IgTlNFIGJhYmllcyB3aGVyZSB0aGV5IGxvb2sgYXQgdGhlIGZhY2UgbW9yZSBkdXJpbmcgcmV2ZXJzZWQgc3RvcmllcyEgCgpgYGB7cn0KIyBHZXQgcGFydGljaXBhbnQtbGV2ZWwgZGF0YQpiYWJpZXNfZmNyMyA8LSBiYWJpZXNfZmNyMiAlPiUKICBzcHJlYWQoZGlyZWN0aW9uLCBmY3IpICU+JQogIGdyb3VwX2J5KG5hbWUsIGFnZSwgbGFuZykgJT4lCiAgbXV0YXRlKGRpZmYgPSAoZm9yd2FyZCAtIHJldmVyc2VkKSkKCmdncGxvdChiYWJpZXNfZmNyMywgYWVzKHggPSBhZ2UsIHkgPSBkaWZmLCBjb2xvciA9IGxhbmcpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsMSkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJSZXZlcnNhbCBFZmZlY3QiKSArCiAgeWxhYigiRm9yd2FyZCBGQ1IgLSBSZXZlcnNlZCBGQ1IiKQpgYGAKClRoaXMgYW5hbHlzaXMgb2Ygd2l0aGluLXN1YmplY3QgdmFyaWF0aW9uIGhlcmU6IAoKYGBge3J9CiMgRmlyc3QgZ2V0IHRoZSBtZWFuIG9mIGVhY2ggdHJpYWwsIFRIRU4gdGhlIHBhcnRpY2lwYW50LWxldmVsIG1lYW5zCndpdGhpbl9zdWJqZWN0cyA8LSBiYWJpZXNfZmNyICU+JQogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGRpcmVjdGlvbiwgc3RvcnksIHJlcGV0aXRpb24pICU+JQogIHN1bW1hcmlzZShmY3IgPSBtZWFuKGZjciwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgY291bnQgPSBuKCkpICU+JQogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGZjciwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2UgPSBzZChmY3IsIG5hLnJtID0gVFJVRSkvc3FydChuKCkpLAogICAgICAgICAgICBjb3VudCA9IG4oKSkKCiMgVGhlbiBzcHJlYWQgb3V0IG1lYW4gYW5kIFNFIGNvbHVtbnMgYnkgZGlyZWN0aW9uCndpdGhpbl9zdWJqZWN0c19tZWFucyA8LSB3aXRoaW5fc3ViamVjdHMgJT4lCiAgc2VsZWN0KC1zZSwgLWNvdW50KSAlPiUKICBzcHJlYWQoZGlyZWN0aW9uLCBtZWFuLCBzZXAgPSAiXyIpCndpdGhpbl9zdWJqZWN0c19zZSA8LSB3aXRoaW5fc3ViamVjdHMgJT4lCiAgc2VsZWN0KC1tZWFuLCAtY291bnQpICU+JQogIHNwcmVhZChkaXJlY3Rpb24sIHNlLCBzZXAgPSAiU0UiKQp3aXRoaW5fc3ViamVjdHMgPC0gbGVmdF9qb2luKHdpdGhpbl9zdWJqZWN0c19tZWFucywgd2l0aGluX3N1YmplY3RzX3NlLCBieSA9IGMoIm5hbWUiLCJsYW5nIikpCgojIE5vdyBsZXQncyBwbG90CmxpbXMgPC0gYygtMSwxKQp3aXRoaW5fc3ViamVjdHMgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZGlyZWN0aW9uX2ZvcndhcmQsIHkgPSBkaXJlY3Rpb25fcmV2ZXJzZWQsIGNvbG9yID0gbGFuZykpICsKICBnZW9tX2FibGluZSgpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49ZGlyZWN0aW9uX3JldmVyc2VkLWRpcmVjdGlvblNFcmV2ZXJzZWQsIHltYXg9ZGlyZWN0aW9uX3JldmVyc2VkK2RpcmVjdGlvblNFcmV2ZXJzZWQpKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW49ZGlyZWN0aW9uX2ZvcndhcmQtZGlyZWN0aW9uU0Vmb3J3YXJkLCB4bWF4PWRpcmVjdGlvbl9mb3J3YXJkK2RpcmVjdGlvblNFZm9yd2FyZCkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJmb3J3YXJkIiwgbGltaXRzID0gYygtMSwxKSkgKwogIHNjYWxlX3lfY29udGludW91cygicmV2ZXJzZWQiLCBsaW1pdHMgPSBjKC0xLDEpKSArCiAgZ2d0aXRsZSgiRkNSIE1lYW5zIikgKwogIGZhY2V0X3dyYXAoImxhbmciKQpgYGAKCkFuZCBhIGNsYXNzaWMgYm94L2Vycm9yIHBsb3Qgd2l0aCBhZ2UgY29sbGFwc2VkLiAKCmBgYHtyfQpiYWJpZXNfZmNyMiAlPiUKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShmY3JfbWVhbiA9IG1lYW4oZmNyKSwKICAgICAgICAgICAgc2QgPSBzZChmY3IpLAogICAgICAgICAgICBuID0gbigpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQobikpICU+JQogIGdncGxvdChhZXMoeCA9IGxhbmcsIHkgPSBmY3JfbWVhbiwgZmlsbCA9IGRpcmVjdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBmY3JfbWVhbi1zZSwgeW1heCA9IGZjcl9tZWFuK3NlKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB3aWR0aCA9IDAuMikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjUsIDAuNSkpICsKICB0aGVtZV9saW5lZHJhdygpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD02fQoKbGlicmFyeShleHRyYWZvbnQpCmxpYnJhcnkoeGtjZCkKCiMgRm9yIG1ha2luZyB0aGUgYmFiaWVzL2FkdWx0cyBjaGFydDogCmJhYmllc19mY3IyICU+JQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGZjcl9tZWFuID0gbWVhbihmY3IpLAogICAgICAgICAgICBzZCA9IHNkKGZjciksCiAgICAgICAgICAgIG4gPSBuKCksCiAgICAgICAgICAgIHNlID0gc2Qvc3FydChuKSkgJT4lCiAgYWRkX2NvbHVtbihncm91cCA9ICdiYWJpZXMnKSAlPiUKICB3cml0ZV9jc3YoImZjcl9jaGFydF9iYWJpZXMuY3N2IikKCmJhYmllc19mY3IyICU+JQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGZjcl9tZWFuID0gbWVhbihmY3IpLAogICAgICAgICAgICBzZCA9IHNkKGZjciksCiAgICAgICAgICAgIG4gPSBuKCksCiAgICAgICAgICAgIHNlID0gc2Qvc3FydChuKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGFuZywgeSA9IGZjcl9tZWFuLCBjb2xvciA9IGRpcmVjdGlvbiwgZmlsbCA9IGRpcmVjdGlvbiwgZ3JvdXAgPSBkaXJlY3Rpb24pKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDAuNSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDYsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjQpKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGZjcl9tZWFuLXNlLCB5bWF4ID0gZmNyX21lYW4rc2UpLCAKICAgICAgICAgICAgICAgIHNpemUgPSAyLCAKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC40KSwgCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMykgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjUsIDAuNSkpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3Qoc2l6ZSA9IDIpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgY29sb3IgPSAibGlnaHQgZ3JheSIsIGxpbmV0eXBlID0gImRhc2hlZCIpKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UsIGZpbGwgPSBGQUxTRSkKCmBgYAoKIyBEaXNjdXNzaW9uIHJlIEFPSS9hbmF0b21pY2FsIGRhdGEKVGhlIGJpZ2dlc3QgY2hhbmdlIGlzIHdlIGxvc3QgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gbGFuZ3VhZ2UgYW5kIGRpcmVjdGlvbi4gRm9yIHRoZSBJQ1NMQSBhYnN0cmFjdCB3ZSByZXBvcnRlZCBhIHN0cm9uZyBpbnRlcmFjdGlvbiAocCA9IDAuMDEpLCBidXQgbm93IGl0J3MgcCA9IDAuMTAuIFNob290LiAKClRoZSBpbnRlcnByZXRhdGlvbiBoZXJlIGlzIHRoYXQ6CgoqIEFsbCBiYWJpZXMgbG9va2VkIGVxdWFsbHkgYXQgYWxsIHZpZGVvcyByZWdhcmRsZXNzIG9mIGxhbmd1YWdlIG9yIGRpcmVjdGlvbi4gR29vZCEKKiBTRSBiYWJpZXMgYXJlIHN0cm9uZ2VyIGZhY2UtbG9va2VycyB0aGFuIE5TRSBiYWJpZXMuIChTYW1lIGFzIElDU0xBKQoqIFJldmVyc2FsIGFwcGVhcnMgdG8gYWZmZWN0IE5TRSBiYWJpZXMgbW9yZSB0aGFuIFNFIGJhYmllcz8gKE1hcmdpbmFsKS4gVGhpcyBpcyB1bmxpa2UgSUNTTEEuIAoKYGBge3IgZXZhbD1GQUxTRSwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTEyLCBpbmNsdWRlPUZBTFNFfQojIENvcnJlbGF0aW9ucwoKIyBMZXQncyB0cnkgY29ycmVsYXRpb25zCmJhYmllc19uc2UgPC0gYmFiaWVzICU+JSAKICBmaWx0ZXIoYW9pICVpbiUgbWlkbGluZSkgJT4lCiAgZmlsdGVyKGxhbmcgPT0gIk5TRSIpICU+JQogIGdyb3VwX2J5KG5hbWUsIGRpcmVjdGlvbiwgYW9pKSAlPiUgCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGRpcmVjdGlvbiA9IGNhc2Vfd2hlbigKICAgIGRpcmVjdGlvbiA9PSAiZm9yd2FyZCIgfiAiZnciLAogICAgZGlyZWN0aW9uID09ICJyZXZlcnNlZCIgfiAicnYiCiAgKSkgJT4lIAogIHVuaXRlKGFvaTIsIGRpcmVjdGlvbiwgYW9pLCBzZXAgPSAiXyIpICU+JQogIHNwcmVhZChhb2kyLCBwZXJjZW50KSAlPiUKICBzZWxlY3QoLW5hbWUpCgpiYWJpZXNfc2UgPC0gYmFiaWVzICU+JSAKICBmaWx0ZXIoYW9pICVpbiUgbWlkbGluZSkgJT4lCiAgZmlsdGVyKGxhbmcgPT0gIlNFIikgJT4lCiAgZ3JvdXBfYnkobmFtZSwgZGlyZWN0aW9uLCBhb2kpICU+JSAKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoZGlyZWN0aW9uID0gY2FzZV93aGVuKAogICAgZGlyZWN0aW9uID09ICJmb3J3YXJkIiB+ICJmdyIsCiAgICBkaXJlY3Rpb24gPT0gInJldmVyc2VkIiB+ICJydiIKICApKSAlPiUgCiAgdW5pdGUoYW9pMiwgZGlyZWN0aW9uLCBhb2ksIHNlcCA9ICJfIikgJT4lCiAgc3ByZWFkKGFvaTIsIHBlcmNlbnQpICU+JQogIHNlbGVjdCgtbmFtZSkKCmdnY29ycihiYWJpZXNfbnNlLCBsYWJlbCA9IFRSVUUsIGxhYmVsX3NpemUgPSA1LCBsYWJlbF9yb3VuZCA9IDIsIGxhYmVsX2FscGhhID0gVFJVRSwgaGp1c3QgPSAwLjksIHNpemUgPSA1LCBjb2xvciA9ICJncmV5NTAiLCBsYXlvdXQuZXhwID0gMSkgKyBnZ3RpdGxlKCJOU0UiKQoKZ2djb3JyKGJhYmllc19zZSwgbGFiZWwgPSBUUlVFLCBsYWJlbF9zaXplID0gNSwgbGFiZWxfcm91bmQgPSAyLCBsYWJlbF9hbHBoYSA9IFRSVUUsIGhqdXN0ID0gMC45LCBzaXplID0gNSwgY29sb3IgPSAiZ3JleTUwIiwgbGF5b3V0LmV4cCA9IDEpICsgZ2d0aXRsZSgiU0UiKQoKbGlicmFyeShjb3JycikKYmFiaWVzX25zZSAlPiUgY29ycmVsYXRlKCkgJT4lIG5ldHdvcmtfcGxvdChtaW5fY29yPTAuNikgKyBnZ3RpdGxlKCJOU0UgQmFiaWVzIikKYmFiaWVzX3NlICU+JSBjb3JyZWxhdGUoKSAlPiUgbmV0d29ya19wbG90KG1pbl9jb3I9MC42KSArIGdndGl0bGUoIlNFIEJhYmllcyIpCmBgYAoKIyBYWSBTcGFjZSBEYXRhCldlJ2xsIGxvYWQgdGhlIGRhdGEgZnJvbSB0aGUgYGNoaWxkeHlkYXRhLmZlYXRoZXJgIGZpbGUgbWFkZSBpbiAwNnJhd3h5ZGF0YS5SbWQuIFNvIGFueSBuZXcgYmFiaWVzLCBwbGVhc2UgcnVuIHRoZSBmaXJzdCBjb2RlIGJsb2NrIGluIDA2IHRvIGluY2x1ZGUgaXQuIFRoZW4gd2UnbGwga2VlcCBhbGwgdGhlIGJhYmllcyB3ZSBhbHNvIGhhdmUgaW4gdGhlIEFPSSBkYXRhIGdyb3VwLiAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmluY2x1ZGVkIDwtIGJhYmllcyAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KG5hbWUpICU+JSAKICBkaXN0aW5jdCgpICU+JQogIHVubGlzdCgpCgp4eWRhdGEgPC0gcmVhZF9mZWF0aGVyKCIuLi9DaGlsZCBEYXRhL2NoaWxkeHlkYXRhLmZlYXRoZXIiKSAlPiUKICByZW5hbWUobmFtZSA9IHBhcnRpY2lwYW50KSAlPiUKICBmaWx0ZXIobmFtZSAlaW4lIGluY2x1ZGVkKQoKIyBHZXQgYWdlcwphZ2VzIDwtIHJlYWRfY3N2KCJjaGlsZHJlbmFnZXMuY3N2IikgJT4lCiAgcmVuYW1lKG5hbWUgPSBwYXJ0aWNpcGFudCkKeHlkYXRhIDwtIHh5ZGF0YSAlPiUgbGVmdF9qb2luKGFnZXMsIGJ5ID0gIm5hbWUiKSAlPiUKICBtdXRhdGUoYWdlID0gYWdlKjEyKSAlPiUKICBtdXRhdGUoYWdlZ3JvdXAgPSBjYXNlX3doZW4oCiAgICBhZ2UgPD0gOC45OSB+ICJ5b3VuZ2VyIiwKICAgIGFnZSA+PSA5LjAgJiBhZ2UgPCAxNSB+ICJvbGRlciIKICApKSAlPiUKICBtdXRhdGUobGFuZ3VhZ2UgPSBjYXNlX3doZW4oCiAgICBsYW5ndWFnZSA9PSAiRW5nbGlzaEV4cG9zZWQiIH4gIk5TRSIsCiAgICBsYW5ndWFnZSA9PSAiU2lnbkxhbmd1YWdlRXhwb3NlZCIgfiAiU0UiCiAgKSkgJT4lCiAgcmVuYW1lKGxhbmcgPSBsYW5ndWFnZSkgJT4lCiAgc2VsZWN0KG5hbWUsIGdyb3VwLCBnZW5kZXIsIGxhbmcsIGNvbmRpdGlvbiwgbWFyaywgdHJpYWwsIHJlcGV0aXRpb24sIHgsIHksIGFnZSwgYWdlZ3JvdXApICU+JQogIHNlcGFyYXRlKGNvbmRpdGlvbiwgaW50byA9IGMoInN0b3J5IiwgImNsaXAiLCAiZGlyZWN0aW9uIikpICU+JQogIHVuaXRlKCJzdG9yeSIsIGMoInN0b3J5IiwgImNsaXAiKSkgJT4lCiAgbXV0YXRlKGRpcmVjdGlvbiA9IGNhc2Vfd2hlbigKICAgIGRpcmVjdGlvbiA9PSAiRVIiIH4gInJldmVyc2VkIiwKICAgIGRpcmVjdGlvbiA9PSAiRlciIH4gImZvcndhcmQiCiAgKSkgJT4lCiAgbXV0YXRlKG5hbWUgPSBmYWN0b3IobmFtZSksCiAgICAgICAgIGdyb3VwID0gZmFjdG9yKGdyb3VwKSwKICAgICAgICAgZ2VuZGVyID0gZmFjdG9yKGdlbmRlciksCiAgICAgICAgIGxhbmcgPSBmYWN0b3IobGFuZyksCiAgICAgICAgIHN0b3J5ID0gZmFjdG9yKHN0b3J5KSwKICAgICAgICAgZGlyZWN0aW9uID0gZmFjdG9yKGRpcmVjdGlvbiksCiAgICAgICAgIG1hcmsgPSBmYWN0b3IobWFyayksCiAgICAgICAgIHRyaWFsID0gZmFjdG9yKHRyaWFsKSwKICAgICAgICAgcmVwZXRpdGlvbiA9IGZhY3RvcihyZXBldGl0aW9uKSwKICAgICAgICAgYWdlZ3JvdXAgPSBmYWN0b3IoYWdlZ3JvdXApKQpgYGAKCiMjIE92ZXJhbGwgTG9va2luZwpMZXQncyBjaGVjayB0aGF0IHdlIGhhdmUgbm8gc2lnbmlmaWNhbnQgZ3JvdXAgb3IgY29uZGl0aW9uIGRpZmZlcmVuY2VzIGluIHRlcm1zIG9mIHZhbGlkIChub3QgZW1wdHkpIGRhdGEgcG9pbnRzIGNvbGxlY3RlZC4gVGhpcyBpcyBzYW1lIGFzICJHbG9iYWwgTG9va2luZyIgd2UgaGF2ZSBhYm92ZSwgcmVhbGx5LCBidXQgdyByYXcgeHkgZGF0YS4gCgpgYGB7cn0KeHlfb3ZlcmFsbCA8LSB4eWRhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYSh4KSkgJT4lCiAgZ3JvdXBfYnkobmFtZSwgYWdlLCBsYW5nLCBkaXJlY3Rpb24sIHN0b3J5LCByZXBldGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoZGF0YV9wb2ludHMgPSBuKCkpICMgZ2V0cyB0b3RhbCBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggdHJpYWwgZm9yIGVhY2ggYmFieQoKIyBUYWJsZSBvZiBtZWFucwp4eV9vdmVyYWxsICU+JSAKICBncm91cF9ieShuYW1lLCBsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShkYXRhX3BvaW50cyA9IG1lYW4oZGF0YV9wb2ludHMpKSAlPiUgIyBnZXQgYXZlcmFnZSBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggYmFieQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGF0YV9wb2ludHMgPSBtZWFuKGRhdGFfcG9pbnRzKSwKICAgICAgICAgICAgY291bnQgPSBuKCksCiAgICAgICAgICAgIHNkID0gc2QoZGF0YV9wb2ludHMpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUKICBzZWxlY3QoLXNkKSAlPiUKICBwcmludCgpCgpnZ3Bsb3QoeHlfb3ZlcmFsbCwgYWVzKHggPSBhZ2UsIHkgPSBkYXRhX3BvaW50cywgY29sb3IgPSBkaXJlY3Rpb24sIGZpbGwgPSBkaXJlY3Rpb24pKSArIAogIGdlb21faml0dGVyKGFscGhhID0gMC41KSArCiAgZmFjZXRfZ3JpZCguIH4gbGFuZykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBnZ3RpdGxlKCJEYXRhIFBvaW50cyIpICsKICB4bGFiKCJhZ2UgKG1vbnRocykiKSArCiAgeWxhYigiZGF0YSBwb2ludHMgcmVjb3JkZWQiKSArIAogIHRoZW1lX2J3KCkgCmBgYAoKCkEgbGluZWFyIG1vZGVsIHNob3dzIHRoZXJlIHdlcmUgbm8gc2lnbmlmaWNhbnQgZWZmZWN0cyBvZiBhbnkgZmFjdG9ycy4gV2UgY2FuIGNvbmNsdWRlIHRoZXJlIHdhcyBubyBlZmZlY3Qgb24gaG93ICptdWNoKiBkYXRhIHdhcyBjb2xsZWN0ZWQgZnJvbSB0aGUgYmFiaWVzLiAgIAoKYGBge3J9Cm92ZXJhbGxfeHlfbG0gPC0gbG1lcihkYXRhX3BvaW50cyB+IGFnZSArIGxhbmcgKiBkaXJlY3Rpb24gKyAoZGlyZWN0aW9ufG5hbWUpICsgKGRpcmVjdGlvbnxzdG9yeSksIGRhdGEgPSB4eV9vdmVyYWxsKQpzdW1tYXJ5KG92ZXJhbGxfeHlfbG0pIApjb25maW50KG92ZXJhbGxfeHlfbG0pCiNnZ2NvZWYob3ZlcmFsbF94eV9sbSkKYGBgCgojIyBYWSBEYXRhIExNTXMKTm93IHdlJ3JlIGdvaW5nIHRvIHJ1biBMTU1zIG9uIGJhYmllcycgcmF3OiAKCiogaG9yaXpvbnRhbCBzcHJlYWQgKG1pZGRsZSA1MCUgb2YgeCBkYXRhOyB4SVFSKQoqIHZlcnRpY2FsIHNwcmVhZCAobWlkZGxlIDUwJSBvZiB5IGRhdGE7IHlJUVIpCiogdmlld2luZyBhcmVhIChBID0gbWlkZGxlLXggKiBtaWRkbGUteTsgYXJlYSkKCkJ1dCB0byBkbyB0aGlzIHdlIGZpcnN0IHRyaW0gZWFjaCBiYWJ5J3MgZGF0YSwgZ2V0dGluZyByaWQgb2YgdGhlIGZpcnN0IDYwIHNhbXBsZXMgKDAuNSBzZWNzKSBvZiBlYWNoIHRyaWFsLiAKCmBgYHtyfQp4eWRhdGEgPC0geHlkYXRhICU+JQogIGdyb3VwX2J5KG5hbWUsdHJpYWwpICU+JQogIHNsaWNlKDYwOm4oKSkKCmlxciA8LSB4eWRhdGEgJT4lCiAgZ3JvdXBfYnkobmFtZSwgYWdlLCBsYW5nLCBzdG9yeSwgZGlyZWN0aW9uLCB0cmlhbCkgJT4lCiAgc3VtbWFyaXNlKHhJUVIgPSBJUVIoeCxuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgIHlJUVIgPSBJUVIoeSxuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgIHhtZWQgPSBtZWRpYW4oeCwgbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICB5bWVkID0gbWVkaWFuKHksIG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgYXJlYSA9IHhJUVIqeUlRUikKaGVhZChpcXIsMjApCgpgYGAKCgojIyMgTWlkZGxlIFgKClJlc3VsdHMgdGVsbCB1cyB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZWZmZWN0IG9mIGFnZSB3aGVyZSBob3Jpem9udGFsIHNwcmVhZCBncmV3IG5hcnJvd2VyIHdpdGggb2xkZXIgYmFiaWVzIChwID0gMC4wMjQ7IHNsb3BlID0gLTIuMiBweC9tb250aCkuIFRoZXJlIHdhcyBhIG1hcmdpbmFsIGVmZmVjdCBvZiBsYW5ndWFnZSB3aGVyZSBTRSBiYWJpZXMgaGF2ZSBzbGlnaHRseSBuYXJyb3dlciBob3Jpem9udGFsIHNwcmVhZCAoMTEgcHg7IHAgPSAwLjA4OCkuIE5vIGVmZmVjdHMgb2YgcmV2ZXJzYWwgb3IgaW50ZXJhY3Rpb25zLgoKYGBge3J9CnhpcXJfbWVhbiA8LSBpcXIgJT4lIAogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbiwgbmFtZSkgJT4lCiAgc3VtbWFyaXNlKHhJUVIgPSBtZWFuKHhJUVIsIG5hLnJtID0gVCkpICU+JSAjIGdldHMgYXZlcmFnZSBsb29raW5nIHBlcmNlbnQgZm9yIGVhY2ggYmFieQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW5feElRUiA9IG1lYW4oeElRUiksICMgZ2V0cyBncm91cCBhdmVyYWdlcwogICAgICAgICAgICBjb3VudCA9IG4oKSwKICAgICAgICAgICAgc2QgPSBzZCh4SVFSKSwKICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KGNvdW50KSkgJT4lCiAgc2VsZWN0KC1zZCkgJT4lCiAgcHJpbnQoKQoKIyBQbG90CmdncGxvdChpcXIsIGFlcyh4ID0gYWdlLCB5ID0geElRUiwgY29sb3IgPSBkaXJlY3Rpb24sIGZpbGwgPSBkaXJlY3Rpb24pKSArIAogIGdlb21faml0dGVyKGFscGhhID0gMC41KSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZmFjZXRfZ3JpZCguIH4gbGFuZykgKwogIGdndGl0bGUoIkhvcml6b250YWwgU3ByZWFkIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJ4SVFSIikKCmdncGxvdCh4aXFyX21lYW4sIGFlcyh4ID0gbGFuZywgeSA9IG1lYW5feElRUiwgZmlsbCA9IGRpcmVjdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX3hJUVItc2UsIHltYXggPSBtZWFuX3hJUVIrc2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC4yKSArCiAgdGhlbWVfbGluZWRyYXcoKQoKeGlxcl9sbSA8LSBsbWVyKHhJUVIgfiBhZ2UgKyBsYW5nICogZGlyZWN0aW9uICsgKDF8bmFtZSkgKyAoMXxzdG9yeSksIGRhdGEgPSBpcXIpCnN1bW1hcnkoeGlxcl9sbSkKY29uZmludCh4aXFyX2xtKQojZ2djb2VmKHhpcXJfbG0pCmBgYAoKCiMjIyBNaWRkbGUgWQoKV2UgaGFkIGEgc2lnbmlmaWNhbnQgZWZmZWN0IG9mIGFnZSB3aGVyZSB2ZXJ0aWNhbCBzcHJlYWQgZ290IG5hcnJvd2VyIHdpdGggb2xkZXIgYmFiaWVzIChwID0gMC4wMTksIHNsb3BlID0gLTUuNSBweC9tb250aCkuIFRoZXJlIHdlcmUgbm8gZWZmZWN0IG9mIGxhbmd1YWdlLCBkaXJlY3Rpb24sIG9yIGludGVyYWN0aW9ucy4gCgpgYGB7cn0KeWlxcl9tZWFuIDwtIGlxciAlPiUgCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uLCBuYW1lKSAlPiUKICBzdW1tYXJpc2UoeUlRUiA9IG1lYW4oeUlRUiwgbmEucm0gPSBUKSkgJT4lICMgZ2V0cyBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UobWVhbl95SVFSID0gbWVhbih5SVFSKSwgIyBnZXRzIGdyb3VwIGF2ZXJhZ2VzCiAgICAgICAgICAgIGNvdW50ID0gbigpLAogICAgICAgICAgICBzZCA9IHNkKHlJUVIpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUKICBzZWxlY3QoLXNkKSAlPiUKICBwcmludCgpCgojIFBsb3QKZ2dwbG90KGlxciwgYWVzKHggPSBhZ2UsIHkgPSB5SVFSLCBjb2xvciA9IGRpcmVjdGlvbiwgZmlsbCA9IGRpcmVjdGlvbikpICsgCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF9ncmlkKC4gfiBsYW5nKSArCiAgZ2d0aXRsZSgiVmVydGljYWwgU3ByZWFkIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJ5SVFSIikKCmdncGxvdCh5aXFyX21lYW4sIGFlcyh4ID0gbGFuZywgeSA9IG1lYW5feUlRUiwgZmlsbCA9IGRpcmVjdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX3lJUVItc2UsIHltYXggPSBtZWFuX3lJUVIrc2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC4yKSArCiAgdGhlbWVfbGluZWRyYXcoKQoKeWlxcl9sbSA8LSBsbWVyKHlJUVIgfiBhZ2UgKyBsYW5nICogZGlyZWN0aW9uICsgKDF8bmFtZSkgKyAoMXxzdG9yeSksIGRhdGEgPSBpcXIpCnN1bW1hcnkoeWlxcl9sbSkKY29uZmludCh5aXFyX2xtKQojZ2djb2VmKHlpcXJfbG0pCmBgYAoKIyMjIFZpZXdpbmcgQXJlYQpBZ2FpbiwgYWdlIGlzIHNpZ25pZmljYW50IChwID0gMC4wMSkgc3VjaCB0aGF0IGFyZWEgZ2V0cyBzbWFsbGVyIHdpdGggYWdlIChhYm91dCA1MDAgc3EuIHB4LiBwZXIgbW9udGgpLiBObyBlZmZlY3Qgb2YgbGFuZ3VhZ2Ugb3IgZGlyZWN0aW9uIG9yIGludGVyYWN0aW9ucy4gCgpgYGB7cn0KYXJlYV9tZWFuIDwtIGlxciAlPiUgCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uLCBuYW1lKSAlPiUKICBzdW1tYXJpc2UoYXJlYSA9IG1lYW4oYXJlYSwgbmEucm0gPSBUKSkgJT4lICMgZ2V0cyBhdmVyYWdlIGxvb2tpbmcgcGVyY2VudCBmb3IgZWFjaCBiYWJ5CiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoYXJlYV9tZWFuID0gbWVhbihhcmVhKSwgIyBnZXRzIGdyb3VwIGF2ZXJhZ2VzCiAgICAgICAgICAgIGNvdW50ID0gbigpLAogICAgICAgICAgICBzZCA9IHNkKGFyZWEpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUKICBzZWxlY3QoLXNkKSAlPiUKICBwcmludCgpCgojIFBsb3QKZ2dwbG90KGlxciwgYWVzKHggPSBhZ2UsIHkgPSBhcmVhLCBjb2xvciA9IGRpcmVjdGlvbiwgZmlsbCA9IGRpcmVjdGlvbikpICsgCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF9ncmlkKC4gfiBsYW5nKSArCiAgZ2d0aXRsZSgiVmlld2luZyBBcmVhIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJBcmVhIChweF4yKSIpCgpnZ3Bsb3QoYXJlYV9tZWFuLCBhZXMoeCA9IGxhbmcsIHkgPSBhcmVhX21lYW4sIGZpbGwgPSBkaXJlY3Rpb24pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYXJlYV9tZWFuLXNlLCB5bWF4ID0gYXJlYV9tZWFuK3NlKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB3aWR0aCA9IDAuMikgKwogIHRoZW1lX2xpbmVkcmF3KCkKCmFyZWFfbG0gPC0gbG1lcihhcmVhIH4gYWdlICsgbGFuZyAqIGRpcmVjdGlvbiArICgxfG5hbWUpICsgKDF8c3RvcnkpLCBkYXRhID0gaXFyKQpzdW1tYXJ5KGFyZWFfbG0pCmNvbmZpbnQoYXJlYV9sbSkKI2dnY29lZihhcmVhX2xtKQpgYGAKCiMjIFBsb3R0aW5nIFZpZXdpbmcgQXJlYSAKCmBgYHtyfQptZWRpYW5zIDwtIGlxciAlPiUKICBncm91cF9ieShuYW1lLGxhbmcsZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoeElRUiA9IG1lYW4oeElRUixuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgIHlJUVIgPSBtZWFuKHlJUVIsbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICB4bWVkID0gbWVhbih4bWVkLG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgeW1lZCA9IG1lYW4oeW1lZCxuYS5ybT1UUlVFKSkgJT4lCiAgZ3JvdXBfYnkobGFuZyxkaXJlY3Rpb24pICU+JSAKICBzdW1tYXJpc2UoeElRUiA9IG1lYW4oeElRUixuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgIHlJUVIgPSBtZWFuKHlJUVIsbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICB4ID0gbWVhbih4bWVkLG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgeSA9IG1lYW4oeW1lZCxuYS5ybT1UUlVFKSkgJT4lCiAgbXV0YXRlKHkgPSB5Ki0xLAogICAgICAgICB4bWluID0geC0oeElRUi8yKSwKICAgICAgICAgeG1heCA9IHgrKHhJUVIvMiksCiAgICAgICAgIHltaW4gPSB5LSh5SVFSLzIpLAogICAgICAgICB5bWF4ID0geSsoeUlRUi8yKSkKaW1nIDwtIHBuZzo6cmVhZFBORygiY2luZHkucG5nIikKZyA8LSBncmlkOjpyYXN0ZXJHcm9iKGltZywgaW50ZXJwb2xhdGU9VFJVRSwgd2lkdGg9dW5pdCgxLCJucGMiKSwgaGVpZ2h0PXVuaXQoMSwibnBjIikpIApnZ3Bsb3QobWVkaWFucywgYWVzKGZpbGw9ZGlyZWN0aW9uLGNvbG9yPWRpcmVjdGlvbikpICsKICBhbm5vdGF0aW9uX2N1c3RvbShnLCB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluPXhtaW4seW1pbj15bWluLHhtYXg9eG1heCx5bWF4PXltYXgpLGFscGhhPS4xKSArIAogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTA4MCksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNzIwLDApLCBleHBhbmQgPSBjKDAsIDApKSArCiAgZmFjZXRfd3JhcCgibGFuZyIpCmBgYAoKIyBQdXBwaWVzCkdldCBwdXBweSBkYXRhIQoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBwdXBwaWVzMSA8LSByZWFkX3RzdigiLi4vQ2hpbGQgRGF0YS9fcHVwcGllcy9hbGwgcHVwcGllcyBncm91cCAxIHN1bXMudHh0IiwgbmEgPSAiLSIpICU+JSAKIyAgIGNsZWFuX25hbWVzKCkgJT4lCiMgICBzZWxlY3QoLWMoYWdlLCBhbmFseXNpcywgY2hlY2tfaWZfd2FudF9zY2F0dGVycGxvdCwgZ2VuZGVyLCBsYW5ndWFnZSkpICU+JQojICAgcmVuYW1lKG5hbWUgPSB4MSkgJT4lCiMgICBtdXRhdGUobWVhbiA9IHJvd01lYW5zKC5bMjoxMF0sIG5hLnJtID0gVCkpICU+JQojICAgc2VsZWN0KG5hbWUsIG1lYW4pCiMgICAKIyBwdXBwaWVzMiA8LSByZWFkX3RzdigiLi4vQ2hpbGQgRGF0YS9fcHVwcGllcy9hbGwgcHVwcGllcyBncm91cCAyIHN1bXMudHh0IiwgbmEgPSAiLSIpICU+JSAKIyAgIGNsZWFuX25hbWVzKCkgJT4lCiMgICBzZWxlY3QoLWMoYWdlLCBhbmFseXNpcywgY2hlY2tfaWZfd2FudF9zY2F0dGVycGxvdCwgZ2VuZGVyLCBsYW5ndWFnZSkpICU+JQojICAgcmVuYW1lKG5hbWUgPSB4MSkgJT4lCiMgICBtdXRhdGUobWVhbiA9IHJvd01lYW5zKC5bMjoxN10sIG5hLnJtID0gVCkpICU+JQojICAgc2VsZWN0KG5hbWUsIG1lYW4pCiMgCiMgcHVwcGllcyA8LSByYmluZChwdXBwaWVzMSwgcHVwcGllczIpCiMgCiMgcGFydGljaXBhbnRzIDwtIHh5ZGF0YSAlPiUgCiMgICBzZWxlY3QobmFtZSwgZ3JvdXAsIGdlbmRlciwgbGFuZykgJT4lIAojICAgZGlzdGluY3QoKQojIAojIHB1cHBpZXMgPC0gbGVmdF9qb2luKHBhcnRpY2lwYW50cywgcHVwcGllcywgYnkgPSAibmFtZSIpCiMgCiMgc3VtbWFyeShsbShkYXRhID0gcHVwcGllcywgbWVhbiB+IGxhbmcpKQojIAojIHB1cHBpZXNfc2UgPC0gZmlsdGVyKHB1cHBpZXMsIGxhbmcgPT0gIk5TRSIpCiMgcHVwcGllc19uc2UgPC0gZmlsdGVyKHB1cHBpZXMsIGxhbmcgPT0gIlNFIikKIyAKIyB0LnRlc3QocHVwcGllc19zZSRtZWFuLCBwdXBwaWVzX25zZSRtZWFuKQoKIyBMZXQncyBkbyB0aGlzIGFnYWluIGJ1dCBwcmVzZXJ2ZSBwdXBweS1sZXZlbCBkYXRhCnB1cHBpZXMxIDwtIHJlYWRfdHN2KCIuLi9DaGlsZCBEYXRhL19wdXBwaWVzL2FsbCBwdXBwaWVzIGdyb3VwIDEgc3Vtcy50eHQiLCBuYSA9ICItIikgJT4lIAogIGNsZWFuX25hbWVzKCkgJT4lCiAgc2VsZWN0KC1jKGFnZSwgYW5hbHlzaXMsIGNoZWNrX2lmX3dhbnRfc2NhdHRlcnBsb3QsIGdlbmRlciwgbGFuZ3VhZ2UpKSAlPiUKICByZW5hbWUobmFtZSA9IHgxKSAlPiUKICBnYXRoZXIoa2V5ID0gcHVwcHksIHZhbHVlID0gc2VjLCAtbmFtZSkgJT4lCiAgbXV0YXRlKHB1cHMgPSBjYXNlX3doZW4oCiAgICBzdHJfZGV0ZWN0KHB1cHB5LCAiaHVza2llcyIpIH4gImh1c2tpZXMiLAogICAgc3RyX2RldGVjdChwdXBweSwgImdvbGRlbiIpIH4gImdvbGRlbiIsCiAgICBzdHJfZGV0ZWN0KHB1cHB5LCAid2F3YSIpIH4gIndhd2EiLAogICAgc3RyX2RldGVjdChwdXBweSwgImZyaXNieSIpIH4gImZyaXNieSIsCiAgICBzdHJfZGV0ZWN0KHB1cHB5LCAiYnVsbGRvZyIpIH4gImJ1bGxkb2ciLAogICAgc3RyX2RldGVjdChwdXBweSwgInB1cHB5X2pwZyIpIH4gInB1cHB5IiwKICAgIFRSVUUgfiBwdXBweQogICkpCgpwdXBwaWVzMiA8LSByZWFkX3RzdigiLi4vQ2hpbGQgRGF0YS9fcHVwcGllcy9hbGwgcHVwcGllcyBncm91cCAyIHN1bXMudHh0IiwgbmEgPSAiLSIpICU+JSAKICBjbGVhbl9uYW1lcygpICU+JQogIHNlbGVjdCgtYyhhZ2UsIGFuYWx5c2lzLCBjaGVja19pZl93YW50X3NjYXR0ZXJwbG90LCBnZW5kZXIsIGxhbmd1YWdlKSkgJT4lCiAgcmVuYW1lKG5hbWUgPSB4MSkgJT4lCiAgZ2F0aGVyKGtleSA9IHB1cHB5LCB2YWx1ZSA9IHNlYywgLW5hbWUpICU+JQogIG11dGF0ZShwdXBzID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChwdXBweSwgImh1c2tpZXMiKSB+ICJodXNraWVzIiwKICAgIHN0cl9kZXRlY3QocHVwcHksICJnb2xkZW4iKSB+ICJnb2xkZW4iLAogICAgc3RyX2RldGVjdChwdXBweSwgIndhd2EiKSB+ICJ3YXdhIiwKICAgIHN0cl9kZXRlY3QocHVwcHksICJmcmlzYnkiKSB+ICJmcmlzYnkiLAogICAgc3RyX2RldGVjdChwdXBweSwgImJ1bGxkb2ciKSB+ICJidWxsZG9nIiwKICAgIHN0cl9kZXRlY3QocHVwcHksICJwdXBwaWVzIikgfiAicHVwcGllcyIsCiAgICBUUlVFIH4gcHVwcHkKICApKQoKcHVwcGllcyA8LSByYmluZChwdXBwaWVzMSxwdXBwaWVzMikKCnBhcnRpY2lwYW50cyA8LSB4eWRhdGEgJT4lCiAgc2VsZWN0KG5hbWUsIGdyb3VwLCBnZW5kZXIsIGxhbmcpICU+JQogIGRpc3RpbmN0KCkKCnB1cHBpZXMgPC0gbGVmdF9qb2luKHBhcnRpY2lwYW50cywgcHVwcGllcywgYnkgPSAibmFtZSIpCgpzdW1tYXJ5KGxtZXIoZGF0YSA9IHB1cHBpZXMsIHNlYyB+IGxhbmcgKyAoMXxuYW1lKSArICgxfHB1cHMpKSkKCmNvbmZpbnQobG1lcihkYXRhID0gcHVwcGllcywgc2VjIH4gbGFuZyArICgxfG5hbWUpICsgKDF8cHVwcykpKQoKZ2dwbG90KHB1cHBpZXMsIGFlcyh4ID0gbGFuZywgeSA9IHNlYywgZmlsbCA9IGxhbmcpKSArIGdlb21fYm94cGxvdCgpCmBgYAoKIyBYWSBTcGFjZSBEYXRhIC0gTXVsdGlwbGUgUGxvdHMKCkZpcnN0IGxldCdzIHByZXAgdGhlIGRhdGEuIApgYGB7cn0KbXVsdGlwbGVzIDwtIHh5ZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHgpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHkpKSAlPiUKICBncm91cF9ieShuYW1lLCBhZ2UsIGxhbmcsIHN0b3J5LCBkaXJlY3Rpb24sIHRyaWFsKSAlPiUKICBzdW1tYXJpc2UoeElRUiA9IElRUih4LG5hLnJtPVRSVUUpLAogICAgICAgICAgICB5SVFSID0gSVFSKHksbmEucm09VFJVRSksCiAgICAgICAgICAgIHhtZWQgPSBtZWRpYW4oeCwgbmEucm09VFJVRSksCiAgICAgICAgICAgIHltZWQgPSBtZWRpYW4oeSwgbmEucm09VFJVRSksCiAgICAgICAgICAgIGFyZWEgPSB4SVFSKnlJUVIsCiAgICAgICAgICAgIHhfOTAgPSBxdWFudGlsZSh4LCAuOTUsIG5hLnJtPVRSVUUpIC0gcXVhbnRpbGUoeCwgLjA1LCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgeV85MCA9IHF1YW50aWxlKHksIC45NSwgbmEucm09VFJVRSkgLSBxdWFudGlsZSh5LCAuMDUsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBhcmVhXzkwID0gKHhfOTApICogKHlfOTApLAogICAgICAgICAgICB4X21lYW4gPSBtZWFuKHgsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHlfbWVhbiA9IG1lYW4oeSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgeF9zZCA9IHNkKHgsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHlfc2QgPSBzZCh5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICB4XzFzZCA9ICh4X21lYW4reF9zZCkgLSAoeF9tZWFuLXhfc2QpLAogICAgICAgICAgICB5XzFzZCA9ICh5X21lYW4reV9zZCkgLSAoeV9tZWFuLXlfc2QpLAogICAgICAgICAgICBhcmVhXzFzZCA9IHhfMXNkICogeV8xc2QsCiAgICAgICAgICAgIHhfMnNkID0gKHhfbWVhbisoeF9zZCoyKSkgLSAoeF9tZWFuLSh4X3NkKjIpKSwKICAgICAgICAgICAgeV8yc2QgPSAoeV9tZWFuKyh5X3NkKjIpKSAtICh5X21lYW4tKHlfc2QqMikpLAogICAgICAgICAgICBhcmVhXzJzZCA9IHhfMnNkICogeV8yc2QpICU+JQogIGdyb3VwX2J5KG5hbWUsIGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlX2lmKGlzLmRvdWJsZSwgZnVucyhtZWFuKSwgbmEucm0gPSBUKSAlPiUKICBncm91cF9ieShsYW5nLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZV9pZihpcy5kb3VibGUsIGZ1bnMobWVhbiksIG5hLnJtID0gVCkKCmltZyA8LSBwbmc6OnJlYWRQTkcoImNpbmR5LnBuZyIpCmcgPC0gZ3JpZDo6cmFzdGVyR3JvYihpbWcsIGludGVycG9sYXRlPVRSVUUsIHdpZHRoPXVuaXQoMSwibnBjIiksIGhlaWdodD11bml0KDEsIm5wYyIpKSAKCmBgYAoKIyMgSVFSIChNaWRkbGUgNTAlKQpMZXQncyBzZWUuIApgYGB7cn0KY3Vycl9kYXRhIDwtIG11bHRpcGxlcyAlPiUgCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChsYW5nLCBkaXJlY3Rpb24sIHhtZWQsIHltZWQsIHhJUVIsIHlJUVIpICU+JQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKHhtaW4gPSB4bWVkLSh4SVFSLzIpLAogICAgICAgICB4bWF4ID0geG1lZCsoeElRUi8yKSwKICAgICAgICAgeW1pbiA9IC0xKih5bWVkLSh5SVFSLzIpKSwKICAgICAgICAgeW1heCA9IC0xKih5bWVkKyh5SVFSLzIpKSkKCmdncGxvdChjdXJyX2RhdGEsIGFlcyhmaWxsPWRpcmVjdGlvbixjb2xvcj1kaXJlY3Rpb24pKSArCiAgYW5ub3RhdGlvbl9jdXN0b20oZywgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZikgKwogIGdlb21fcmVjdChhZXMoeG1pbj14bWluLHltaW49eW1pbix4bWF4PXhtYXgseW1heD15bWF4KSxhbHBoYT0uMSkgKyAKICB0aGVtZV9saW5lZHJhdygpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwODApLCBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTcyMCwwKSwgZXhwYW5kID0gYygwLCAwKSkgKwogIGZhY2V0X3dyYXAoImxhbmciKQpgYGAKCiMjIE1pZGRsZSA5MCUKU28gSSBjYWxjdWxhdGVkIHRoZSBhdmVyYWdlIG1lZGlhbiBhY3Jvc3MsIGFuZCB0aGUgbWlkZGxlIDkwJSBvZiB0aGUgZGF0YS4gCmBgYHtyfQpjdXJyX2RhdGEgPC0gbXVsdGlwbGVzICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGxhbmcsIGRpcmVjdGlvbiwgeG1lZCwgeW1lZCwgeF85MCwgeV85MCkgJT4lCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoeG1pbiA9IHhtZWQtKHhfOTAvMiksCiAgICAgICAgIHhtYXggPSB4bWVkKyh4XzkwLzIpLAogICAgICAgICB5bWluID0gLTEqKHltZWQtKHlfOTAvMikpLAogICAgICAgICB5bWF4ID0gLTEqKHltZWQrKHlfOTAvMikpKQoKZ2dwbG90KGN1cnJfZGF0YSwgYWVzKGZpbGw9ZGlyZWN0aW9uLGNvbG9yPWRpcmVjdGlvbikpICsKICBhbm5vdGF0aW9uX2N1c3RvbShnLCB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluPXhtaW4seW1pbj15bWluLHhtYXg9eG1heCx5bWF4PXltYXgpLGFscGhhPS4xKSArIAogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTA4MCksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNzIwLDApLCBleHBhbmQgPSBjKDAsIDApKSArCiAgZmFjZXRfd3JhcCgibGFuZyIpCgoKIyBnZ3Bsb3QoZmlsdGVyKGN1cnJfZGF0YSwgbGFuZyA9PSAiTlNFIiksIGFlcyhmaWxsPWRpcmVjdGlvbixjb2xvcj1kaXJlY3Rpb24pKSArCiMgICBhbm5vdGF0aW9uX2N1c3RvbShnLCB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mKSArCiMgICBnZW9tX3JlY3QoYWVzKHhtaW49eG1pbix5bWluPXltaW4seG1heD14bWF4LHltYXg9eW1heCksYWxwaGE9LjIsIHNpemUgPSAxKSArIAojICAgdGhlbWVfbGluZWRyYXcoKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwODApLCBleHBhbmQgPSBjKDAsIDApKSArCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNzIwLDApLCBleHBhbmQgPSBjKDAsIDApKQojIAojIAojIGdncGxvdChmaWx0ZXIoY3Vycl9kYXRhLCBsYW5nID09ICJTRSIpLCBhZXMoZmlsbD1kaXJlY3Rpb24sY29sb3I9ZGlyZWN0aW9uKSkgKwojICAgYW5ub3RhdGlvbl9jdXN0b20oZywgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZikgKwojICAgZ2VvbV9yZWN0KGFlcyh4bWluPXhtaW4seW1pbj15bWluLHhtYXg9eG1heCx5bWF4PXltYXgpLGFscGhhPS4yLCBzaXplID0gMSkgKyAKIyAgIHRoZW1lX2xpbmVkcmF3KCkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMDgwKSwgZXhwYW5kID0gYygwLCAwKSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTcyMCwwKSwgZXhwYW5kID0gYygwLCAwKSkKYGBgCgoKIyMgwrExIFNEIChNaWRkbGUgNjglKQpTbyB0aGlzIGlzIHVzaW5nIHRoZSBtZWFuIG9mIHRoZSBtZWFucywgcGx1cyBvciBtaW51cyBvbmUgU0QuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gbWlkZGxlIDY4JS4gCmBgYHtyfQpjdXJyX2RhdGEgPC0gbXVsdGlwbGVzICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGxhbmcsIGRpcmVjdGlvbiwgeF9tZWFuLCB5X21lYW4sIHhfMXNkLCB5XzFzZCkgJT4lCiAgZ3JvdXBfYnkobGFuZywgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoeG1pbiA9IHhfbWVhbi0oeF8xc2QvMiksCiAgICAgICAgIHhtYXggPSB4X21lYW4rKHhfMXNkLzIpLAogICAgICAgICB5bWluID0gLTEqKHlfbWVhbi0oeV8xc2QvMikpLAogICAgICAgICB5bWF4ID0gLTEqKHlfbWVhbisoeV8xc2QvMikpKQoKZ2dwbG90KGN1cnJfZGF0YSwgYWVzKGZpbGw9ZGlyZWN0aW9uLGNvbG9yPWRpcmVjdGlvbikpICsKICBhbm5vdGF0aW9uX2N1c3RvbShnLCB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluPXhtaW4seW1pbj15bWluLHhtYXg9eG1heCx5bWF4PXltYXgpLGFscGhhPS4xKSArIAogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTA4MCksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNzIwLDApLCBleHBhbmQgPSBjKDAsIDApKSArCiAgZmFjZXRfd3JhcCgibGFuZyIpCmBgYAoKIyMgwrEyIFNEIChNaWRkbGUgOTYlKQpBbmQgdGhpcyBpcyB1c2luZyB0aGUgbWVhbiBvZiB0aGUgbWVhbnMsIHBsdXMgb3IgbWludXMgdHdvIFNELiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIG1pZGRsZSA5NiUuIApgYGB7cn0KY3Vycl9kYXRhIDwtIG11bHRpcGxlcyAlPiUgCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChsYW5nLCBkaXJlY3Rpb24sIHhfbWVhbiwgeV9tZWFuLCB4XzJzZCwgeV8yc2QpICU+JQogIGdyb3VwX2J5KGxhbmcsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKHhtaW4gPSB4X21lYW4tKHhfMnNkLzIpLAogICAgICAgICB4bWF4ID0geF9tZWFuKyh4XzJzZC8yKSwKICAgICAgICAgeW1pbiA9IC0xKih5X21lYW4tKHlfMnNkLzIpKSwKICAgICAgICAgeW1heCA9IC0xKih5X21lYW4rKHlfMnNkLzIpKSkKCmdncGxvdChjdXJyX2RhdGEsIGFlcyhmaWxsPWRpcmVjdGlvbixjb2xvcj1kaXJlY3Rpb24pKSArCiAgYW5ub3RhdGlvbl9jdXN0b20oZywgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZikgKwogIGdlb21fcmVjdChhZXMoeG1pbj14bWluLHltaW49eW1pbix4bWF4PXhtYXgseW1heD15bWF4KSxhbHBoYT0uMSkgKyAKICB0aGVtZV9saW5lZHJhdygpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwODApLCBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTcyMCwwKSwgZXhwYW5kID0gYygwLCAwKSkgKwogIGZhY2V0X3dyYXAoImxhbmciKQpgYGA=